Java多線程中的同步機(jī)制會對資源進(jìn)行加鎖,保證在同一時間只有一個線程可以操作對應(yīng)資源,避免多程同時訪問相同資源發(fā)生沖突。synchronized是Java中的關(guān)鍵字,它是一種同步鎖,可以實現(xiàn)同步機(jī)制。
synchronized主要修飾的對象有以下三種:
修飾普通方法 一個對象中的加鎖方法只允許一個線程訪問。但要注意這種情況下鎖的是訪問該方法的實例對象, 如果多個線程不同對象訪問該方法,則無法保證同步。
修飾靜態(tài)方法 由于靜態(tài)方法是類方法,所以這種情況下鎖的是包含這個方法的類,也就是類對象;這樣如果多個線程不同對象訪問該靜態(tài)方法,也是可以保證同步的。
修飾代碼塊 其中普通代碼塊如
synchronized(obj),這里的obj可以為類中的一個屬性,也可以是當(dāng)前的對象,它的同步效果和修飾普通方法一樣;synchronized(obj.class)靜態(tài)代碼塊,它的同步效果和修飾靜態(tài)方法類似。
synchronized方法控制范圍較大,它會同步對象中所有synchronized方法的代碼。
synchronized代碼塊控制范圍較小,它只會同步代碼塊中的代碼,而位于代碼塊之外的代碼是可以被多個線程訪問的。
簡單來說,就是synchronized代碼塊更加靈活精確。
問題
有如下一個類 A
class A {
public synchronized void a() {
}
public synchronized void b() {
}
}
然后創(chuàng)建兩個對象
A a1 = new A();
A a2 = new A();
然后在兩個線程中并發(fā)訪問如下代碼:
Thread1????Thread2
a1.a();????????a2.a();
請問二者能否構(gòu)成線程同步?
如果A的定義是下面這種呢?
class A {
public static synchronized void a() {
}
public static synchronized void b() {
}
}
答案
問題1 :不能同步
問題2:能同步