Java多線程中線程安全與鎖問題
線程安全
- 無狀態的對象必定是線程安全的。
- 大多數Servlet都是無狀態的,從而極大地下降了實現Servlet線程安全性的複雜性。只有當Servlet在處理請求時須要保存一些信息時,纔可能會產生線程安全問題。
- 要保持狀態的一致性,就須要在單個原子操做中更新全部相關的狀態變量。
- 併發環境中的原子性與事務應用程序中的原子性有着相同的含義—一組語句做爲一個不可分割的單元被執行。
- 對於可能被多個線程同時訪問的可變狀態變量,在訪問它的時候須要持有同一把鎖,在這種狀況下,稱狀態變量是由這個鎖保護的。
鎖問題
- 一個對象裏面若是有多個synchronized方法,某一時刻內,只要一個線程去調用其中的一個synchronized方法了,其餘的線程都只能等待,換句話說,某一個時刻內,只能有惟一一個線程去訪問這些synchronized方法
- 鎖的是當前對象this,被鎖定後,其它的線程都不能進入到當前對象的其它的synchronized方法。普通方法和同步鎖無關
- 全部的非靜態同步方法用的都是同一把鎖---實例對象自己(若是一個實例對象的非靜態同步方法獲取鎖後,該實例對象的其餘非靜態同步方法必須等待獲取鎖的方法釋放後才能獲取鎖,別的實例對象的非靜態同步方法由於跟該實例對象的非靜態同步方法用的是不一樣的鎖,因此不須要等待該實例對象已獲取鎖的非靜態同步方法釋放鎖就能夠獲取他們本身的鎖)
- 全部的靜態同步方法用的也是同一把鎖---類對象自己(靜態同步方法與非靜態同步方法之間不會有競態條件,可是一旦一個靜態同步方法獲取鎖後,其餘的靜態同步方法都必須等待該方法釋放鎖後才能獲取鎖,而無論是同一個實例對象的靜態同步方法之間,仍是不一樣的實例對象的靜態同步方法之間,只要它們是一個類的實例對象!)
歡迎關注本站公眾號,獲取更多信息