要編寫線程安全的代碼,其核心在於要對狀態訪問操做進行管理,特別是對共享的(Shared)和可變的(Mutable)狀態的訪問。html
Java中的主要同步機制是關鍵字synchronized,它提供了一種獨佔的加鎖方式,可是同步這個術語還包括volatiel類型的變量,顯式鎖(Explicit Lock)以及原子變量。 java
1.概念說明編程
線程安全:當多個線程訪問某個類時,無論運行時環境採用何種調度方式或者這些線程將如何交替執行,而且在主調代碼中不須要任何額外的同步或協同,這個類都能表現出正確的行爲,那麼就稱這個類是線程安全的。安全
原子操做:是指對於訪問同一個狀態的全部操做(包括該操做自己)來講,這個操做是一個以原子方式執行的操做。多線程
內存可見性(Memory Visibility):當一個線程修改了某個狀態對象後,其它線程可以看到發生的狀態變化併發
要保持狀態的一致性,就須要在單個原子操做中更新全部相關的狀態變量。框架
2.同步說明post
並不是全部的數據都須要鎖的保護,只有被多個線程同時訪問的可變變量才須要經過鎖保護。 url
一種常見的加鎖約定是:將全部的可變狀態都封裝在對象內部,並經過對象的內置鎖對象對全部訪問狀態的代碼路徑進行同步,使得在該對象上不會發生併發訪問。spa
加鎖的含義不單單侷限於互斥行爲,還包括內存可見性。爲了確保全部線程都能看到共享變量的最新值,全部執行讀操做或寫操做的線程都必須在同一個鎖上面同步。
3.幾種同步的具體使用方法
因爲同步有幾種實現方法,下面各篇分別介紹synchronized、volatile、顯式鎖和原子變量:
4.線程池用法
因爲線程生命週期的開銷很是高、資源消耗及穩定性,在線程多線程時候,應該先考慮使用線程池。
線程池簡化了線程的管理工做,而且java.util.concurrent提供了一種靈活的線程池實現做爲Executor框架的一部分。
併發編程的一種編程方式是把任務拆分爲一些列的小任務,即Runnable,而後在提交給一個Executor執行,Executor.execute(Runnalbe) 。Executor在執行時使用內部的線程池完成操做
說明:
該系列主要參考《Java 併發編程實戰》以及平時在網上收集的一些內容,固然也加上了本身的一些理解和認識