作用
- 保證在同一時刻只有一個執行緒執行某段程式碼,以保證併發安全。
- 當一個執行緒訪問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。