指標:理解synchronized的含義握童、明確synchronized關鍵字修飾普通方法、靜態(tài)方法和碼塊時鎖對象的差異
1:方法內的變量是線程私有的耐薯,不存在同步問題
2:明確概念键痛,需要使用synchronized說明是需要數據共享
3:臟讀概念育八?即線程不安全造成的數組被覆蓋出錯等臟數據問題
4:多線程單對象补箍,即多個線程操作單個對象的的實例變量改执,需要使用synchronized來進行數據同步
5:多線程多對象非靜態(tài),異步執(zhí)行坑雅,因為鎖的是對象辈挂,鎖不同,不構成同步機制霞丧,算異步執(zhí)行
6:多線程多對象靜態(tài)呢岗,鎖的是類冕香,構成同步機制蛹尝,需要數據同步
classA{
public synchronized void a(){
?}
public synchronized void b(){?
}
}
然后創(chuàng)建兩個對象
A a1 =newA();A a2 =newA();
然后在兩個線程中并發(fā)訪問如下代碼
Thread1 Thread2
a1.a(); a2.a();
請問二者能否構成線程同步后豫?
問題二:如果A的定義是下面這種呢?
classA{?
public static synchronized void a(){? ?
?}
public static synchronized void b(){?
?? }
}
解答一:不構成同步突那,這屬于多線程多對象的問題挫酿,取得的鎖的對象鎖,a1對象鎖和a2對象鎖愕难,2把鎖不同早龟,異步執(zhí)行,不需要做線程的數據同步
解答二:構成同步猫缭,這也是多線程多對象的問題葱弟,但是因為是靜態(tài)方法,因此加的鎖的類鎖猜丹,類鎖可以對類的所有對象實例起作用芝加,因此a1和a2取的鎖的一把鎖,構成同步射窒;