Java多執行緒之synchronized理論

Sophie May發表於2019-04-01

作用

  • 保證在同一時刻只有一個執行緒執行某段程式碼,以保證併發安全。
  • 當一個執行緒訪問object的一個synchronized(this)同步程式碼塊時,另一個執行緒仍然可以訪問該object中的非synchronized(this)同步程式碼塊。
  • 當一個執行緒訪問object的一個synchronized(this)同步程式碼塊時,其他執行緒對object中所有其它synchronized(this)同步程式碼塊的訪問將被阻塞。

synchronized兩種用法

  • 類鎖 synchronized修飾的靜態方法或者指定鎖為class物件
public static synchronized void sync();
public synchroinized void sync(Math.class);
複製程式碼
  • 物件鎖 預設this為當前例項物件的方法鎖或者同步程式碼塊鎖(自己註定鎖物件)
public  synchronized void sync();
Object object = new Object();
public synchroinized void sync(object);
複製程式碼

synchronized性質

  • 可重入 同一執行緒的外層函式獲取到鎖之後,內層函式可以直接獲得該鎖。
  • 不可中斷 一旦鎖已經被別的執行緒獲的,其他執行緒只能等待這個鎖被釋放,獲取不到鎖,將一直等待。

synchronized與ReentrantLock選擇

  • 優先選擇java.util.concurrent包中的一種機制,避免使用synchronized和ReentrantLock。
  • 如果synchronized適合你的程式,儘可能優先使用它,減少編寫程式碼的數量和出錯的機率。
  • 如果需要使用ReentrantLock獨有的特性,才選擇使用ReentrantLock。

相關文章