- 互斥鎖埠啃,鎖住一塊代碼區(qū)。
- 提問:什么叫互斥鎖伟恶?
- 互斥鎖又叫排他鎖碴开,它作用于一塊代碼區(qū),則同一個時刻博秫,只允許有一個線程訪問潦牛,不管是讀還是寫。
- 兩種用法:
- 作用于方法內(nèi)的一塊代碼區(qū)台盯。
Synchronized(object){} 含義:object是Object類的一個實例(即除非基本類型外的任意對象實例)罢绽,每個實例有一個對象鎖。這句語法的含義就是:只有獲得了object的對象鎖静盅,才能執(zhí)行{}內(nèi)的代碼塊良价。當多個線程同時想要獲取某一個對象鎖時,只會有一個獲得蒿叠,其他線程會阻塞等待明垢。
- 作用于方法上。
- 非靜態(tài)方法:多線程中同時掉用同一個對象實例的方法時市咽,會有互斥現(xiàn)象發(fā)生痊银。
多線程中同時掉用不同一個對象實例的方法時,不會有互斥現(xiàn)象發(fā)生施绎。
- 靜態(tài)方法:對所有類對象起作用溯革,只要調(diào)用這個方法,不管是不是通過同一個類對象還是不同類對象谷醉,都會有互斥現(xiàn)象致稀。
- 舉個例子
class RetryTest1 {
private int i = 0;
private static int s = 0;
public void add(){ //線程不安全
s++;
}
public void addSyncI(){ //線程安全
synchronized (this) {
i++;
}
}
public void addSyncS(){ //線程不安全
synchronized (this) {
s++;
}
}
public synchronized void addSyncFun(){ //線程不安全
s++;
}
public static synchronized void addSyncStaticFun(){ //線程安全
s++;
}
}
- 代碼解釋
- add方法顯然線程不安全。這個就不解釋了俱尼。
- addSyncI方法是線程安全的抖单,因為i是非靜態(tài)變量,即每個類對象擁有各自的變量。這里synchronized(this)意思就是本類對象的意思矛绘。所以是線程安全的耍休。
- addSyncS方法是線程不安全的,因為s是靜態(tài)變量货矮,而synchronized修飾的是非靜態(tài)方法羊精,即如果多線程中同時調(diào)用不同類對象的該方法,就會有問題次屠。
- addSyncFun方法是線程安全的园匹,因為synchronized修飾的是靜態(tài)方法,即這個方法本身任何情況下都是互斥的劫灶,所以是線程安全的裸违。
最后編輯于 :
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者