理解synchronized關(guān)鍵字

Java多線程中的同步機(jī)制會對資源進(jìn)行加鎖,保證在同一時間只有一個線程可以操作對應(yīng)資源,避免多程同時訪問相同資源發(fā)生沖突。synchronized是Java中的關(guān)鍵字,它是一種同步鎖,可以實現(xiàn)同步機(jī)制。

synchronized主要修飾的對象有以下三種:

  1. 修飾普通方法 一個對象中的加鎖方法只允許一個線程訪問。但要注意這種情況下鎖的是訪問該方法的實例對象, 如果多個線程不同對象訪問該方法,則無法保證同步。

  2. 修飾靜態(tài)方法 由于靜態(tài)方法是類方法,所以這種情況下鎖的是包含這個方法的類,也就是類對象;這樣如果多個線程不同對象訪問該靜態(tài)方法,也是可以保證同步的。

  3. 修飾代碼塊 其中普通代碼塊如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:能同步

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容