這兩天補了下多線程的東西,看了看書,看了看大牛們寫的,有了寫粗淺的理解,現(xiàn)在自己總結(jié)下
synchronized有兩種用法,同步方法和同步代碼塊
總結(jié)如下:
1、當(dāng)一個線程通過A對象訪問一個非靜態(tài)的同步方法(或同步代碼塊)時,其他線程通過A對象訪問非靜態(tài)同步方法(或同步代碼塊)的操作都會被鎖定。但是其他線程通過A對象訪問非靜態(tài)非同步方法的操作不會被鎖定,而且通過B對象訪問非靜態(tài)同步方法的操作也不會被鎖。(因為各個對象的鎖是獨立的所以叫做對象鎖)
2、當(dāng)一個線程訪問靜態(tài)同步方法或者由類鎖修飾的同步代碼塊時,所有該類的靜態(tài)方法或者被同一個類鎖修飾的同步代碼塊都會被鎖定,其他線程無法訪問。
3、類鎖和對象鎖互不影響。
4、修飾方法和修飾代碼塊在本質(zhì)上是一樣的,區(qū)別只在于修飾代碼塊的方式在競爭激烈的情況下更加高效。
5、注意區(qū)別以下代碼的對象鎖的持有情況
public class Human {
//XiaoMing.eatDinner();
public synchronized void eatDinner() { //這里的鎖是XiaoMing
pickupByLeftHand();
eatFoodByMouth();
};
//XiaoMing.eatDinner2();
public void eatDinner() {
synchronized(this) { //這里的鎖是XiaoMing
pickupByLeftHand();
eatFoodByMouth();
}
};
//XiaoMing.drinkWater();
public void drinkWater() {
pickupByRightHand();
synchronized (mouth) { //這里的鎖是mouth
drinkWaterByMouth();
}
}
}
參考資料:https://blog.csdn.net/luoweifu/article/details/46613015
https://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html
http://www.itdecent.cn/p/9abdf1de5d40