Java多執行緒中執行緒安全與鎖問題

木頭房子de發表於2018-11-27

執行緒安全

  1. 無狀態的物件一定是執行緒安全的。
  • 大多數Servlet都是無狀態的,從而極大地降低了實現Servlet執行緒安全性的複雜性。只有當Servlet在處理請求時需要儲存一些資訊時,才可能會產生執行緒安全問題。
  1. 要保持狀態的一致性,就需要在單個原子操作中更新所有相關的狀態變數。
  2. 併發環境中的原子性與事務應用程式中的原子性有著相同的含義—一組語句作為一個不可分割的單元被執行。
  3. 對於可能被多個執行緒同時訪問的可變狀態變數,在訪問它的時候需要持有同一把鎖,在這種情況下,稱狀態變數是由這個鎖保護的。

鎖問題

  1. 一個物件裡面如果有多個synchronized方法,某一時刻內,只要一個執行緒去呼叫其中的一個synchronized方法了,其他的執行緒都只能等待,換句話說,某一個時刻內,只能有唯一一個執行緒去訪問這些synchronized方法
  2. 鎖的是當前物件this,被鎖定後,其它的執行緒都不能進入到當前物件的其它的synchronized方法。普通方法和同步鎖無關
  3. 所有的非靜態同步方法用的都是同一把鎖---例項物件本身(如果一個例項物件的非靜態同步方法獲取鎖後,該例項物件的其他非靜態同步方法必須等待獲取鎖的方法釋放後才能獲取鎖,別的例項物件的非靜態同步方法因為跟該例項物件的非靜態同步方法用的是不同的鎖,所以不需要等待該例項物件已獲取鎖的非靜態同步方法釋放鎖就可以獲取他們自己的鎖)
  4. 所有的靜態同步方法用的也是同一把鎖---類物件本身(靜態同步方法與非靜態同步方法之間不會有競態條件,但是一旦一個靜態同步方法獲取鎖後,其他的靜態同步方法都必須等待該方法釋放鎖後才能獲取鎖,而不管是同一個例項物件的靜態同步方法之間,還是不同的例項物件的靜態同步方法之間,只要它們是一個類的例項物件!)

相關文章