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