當前位置:
首頁 > 知識 > Java並發編程實戰:線程基本概念

Java並發編程實戰:線程基本概念

學習Java並發已經有一個多月了,感覺有些東西學習一會兒了就會忘記,做了一些筆記但是不系統,對於Java並發這麼大的「系統」,需要自己好好總結、整理才能征服它。希望同仁們一起來學習Java並發編程,共同進步,互相指導。

在學習Java並發之前我們需要先理解一些基本的概念:共享、可變、線程安全性、線程同步、原子性、可見性、有序性。

共享和可變

要編寫線程安全的代碼,其核心在於對共享的和可變的狀態進行訪問。

「共享」就意味著變數可以被多個線程同時訪問。我們知道系統中的資源是有限的,不同的線程對資源都是具有著同等的使用權。有限、公平就意味著競爭,競爭就有可能會引發線程問題。

「可變」是指變數的值在其生命周期內是可以發生改變的。「可變」對應的是「不可變」。我們知道不可變的對象一定是線程安全的,並且永遠也不需要額外的同步(因為一個不可變的對象只要構建正確,其外部可見狀態永遠都不會發生改變)。所以「可變」意味著存在線程不安全的風險。解決辦法:

1、不在線程中共享該狀態變數,可以將變數封裝到方法中。

2、將狀態變數修改為不可變的變數(final)。

3、訪問狀態變數時使用同步策略。

4、使用原子變數類。

線程安全性

線程安全是一個比較複雜的概念。其核心概念就是正確性。所謂正確性就是某各類的行為與其規範完全一致,即其近似與「所見即所知(we know it when we see it)」。當多個線程訪問某各類時,不管運行時環境採用何種調度方式或者這些線程將如何交替執行,並且在主調代碼中不需要任何額外的同步或者協同,這個類都能表現出正確的行為,那麼就稱這個類是線程安全的。(引自:《Java並發編程實戰》)

線程同步

線程通過其核心就在於一個「同」。所謂「同」就是協同、協助、配合,「同步」就是協同步調昨,也就是按照預定的先後順序進行運行,即「你先,我等, 你做完,我再做」。

線程同步,就是當線程發出一個功能調用時,在沒有得到結果之前,該調用就不會返回,其他線程也不能調用該方法。就一般而言,我們在說同步、非同步的時候,特指那些需要其他組件來配合或者需要一定時間來完成的任務。在多線程編程裡面,一些較為敏感的數據時不允許被多個線程同時訪問的,使用線程同步技術,確保數據在任何時刻最多只有一個線程訪問,保證數據的完整性。

線程同步的機制主要有:臨界區、互斥量、事件、信號量四種方式

1、臨界區:通過對多線程的串列化來訪問公共資源或一段代碼,速度快,適合控制數據訪問。在任意時刻只允許一個線程對共享資源進行訪問,如果有多個線程試圖訪問公共資源,那麼在有一個線程進入後,其他試圖訪問公共資源的線程將被掛起,並一直等到進入臨界區的線程離開,臨界區在被釋放後,其他線程才可以搶佔。

2、互斥量:採用互斥對象機制。 只有擁有互斥對象的線程才有訪問公共資源的許可權,因為互斥對象只有一個,所以能保證公共資源不會同時被多個線程訪問。互斥不僅能實現同一應用程序的公共資源安全共享,還能實現不同應用程序的公共資源安全共享。

3、信號量:它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數目。

4、事 件: 通過通知操作的方式來保持線程的同步,還可以方便實現對多個線程的優先順序比較的操作。

原子性

原子是世界上最小的單位,具有不可分割性。在我們編程的世界裡,某個操作如果不可分割我們就稱之為該操作具有原子性。例如:i = 0,這個操作是不可分割的,所以該操作具有原子性。如果某個操作可以分割,那麼該操作就不具備原子性,例如i++。非原子操作都存在線程安全問題,這個時候我們需要使用同步機制來保證這些操作變成原子操作,來確保線程安全。

可見性

線程可見性是指線程之間的可見性,即一個線程對狀態的修改對另一個線程是可見的,也就是一個線程修改的結果,另外一個線程立馬就知道了。比如volitile修飾的變數,就具備可見性。

有序性

有序性指的是數據不相關的變數在並發的情況下,實際執行的結果和單線程的執行結果是一樣的,不會因為重排序的問題導致結果不可預知。volatile, final, synchronized,顯式鎖都可以保證有序性。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 java學習吧 的精彩文章:

IT行業這麼熱,可是不是每個人都能幹程序員這一行
搞IT不等於程序猿!為什麼大家都想進入IT行業?
編程語言是部車,你選了其中哪輛?
你真的決心學習好Java了嗎?

TAG:java學習吧 |

您可能感興趣

Python 並發編程之線程池/進程池
JStorm系列:概念與編程模型
「並發編程」Future模式及JDK中的實現
Python 並發編程之協程/非同步IO
技術分享:Golang並發編程
Shell編程基礎
教程|在Julia編程中實現GPU加速
Git 的編程
Redis 編程
android 多線程編程
Python網路編程——進程
fanuc編程與操作視頻教程
Python中的並行處理:實例編程指南
XPath 編程
WebPages編程C和VB實例
Shell 腳本編程陷阱
Perl 編程
深入Python多進程編程基礎
Python3實用編程技巧+案例
慧編程mBlock 5——編程學習之橋