2015-08-28 72 views
-2

類中有兩種方法,都是同步的。 有兩個線程同時運行。線程1是否可以同時執行方法1和線程2是否執行方法2?同一類中的兩種方法同步

class A { 

    public synchronized void method1() { 


    } 

    public synchronized void method2() { 


    } 

} 

回答

0

否是不可能與您的代碼。

當您對整個方法使用關鍵字​​鎖定在對象this上完成。所以這兩個方法的鎖定是相同的(如果在同一個對象上執行的話)。

但是,如果你需要允許兩個不同的線程訪問方法1和方法2.同時你可以這樣做換鎖:

Object lock1 = new Object(); 
Object lock2 = new Object(); 

public void method1() { 
    synchronized(lock1) { 
     ... 
    } 
} 

public void method2() { 
    synchronized(lock2) { 
     ... 
    } 
} 

這樣做,你從this更改同步鎖定對象lock1method1併爲lock2method2

3

請記住,鎖在實例級而非類級別工作。對於A的每個實例,最多一個在method1method2之間可以在任何給定時刻運行。

然而,如果有的A兩個不同的實例,例如a1a2a1.method1()可以運行交錯用a2.method1()(或a2.method2())。

+0

如果存在即a1和a2,a1的兩個實例可以在同一時間只訪問方法1或方法2。 – user3677652

+0

無法理解你的觀點......它不是* *訪問方法1或方法2。當我們談論訪問時,我們正在討論線程而不是對象 – Raffaele

+0

我試圖更加準確地將它描述爲「*實例方法在實例級別上工作*」,因爲'static'方法上的'synchronized'確實可以工作在班級一級。 –

0

不,同步鎖定一個對象,而不僅僅是該方法。一旦一個線程訪問了一個同步的方法,那個類中的其餘方法(同步或非同步)就不能再被任何其他線程訪問,直到正在運行的線程進入可運行狀態,在該狀態下鎖可用於下一個線程獲取。

0

所以我相信你問的問題是:「如果我同時使用這兩種方法,兩個不同的線程能夠訪問兩種不同的同步方法嗎?」

答案是,這取決於。

與您提供的語法同步發生在實例級別。

因此,如果線程1和線程2訪問相同的實例,然後。 線程2被鎖定,直到線程1可以處理。

但是,如果線程1和線程2訪問不同的實例,那麼YES。 線程2不必等到線程1完成,因爲實例不同。用於同步

更多的參考資料: