類中有兩種方法,都是同步的。 有兩個線程同時運行。線程1是否可以同時執行方法1和線程2是否執行方法2?同一類中的兩種方法同步
class A {
public synchronized void method1() {
}
public synchronized void method2() {
}
}
類中有兩種方法,都是同步的。 有兩個線程同時運行。線程1是否可以同時執行方法1和線程2是否執行方法2?同一類中的兩種方法同步
class A {
public synchronized void method1() {
}
public synchronized void method2() {
}
}
否是不可能與您的代碼。
當您對整個方法使用關鍵字鎖定在對象this
上完成。所以這兩個方法的鎖定是相同的(如果在同一個對象上執行的話)。
但是,如果你需要允許兩個不同的線程訪問方法1和方法2.同時你可以這樣做換鎖:
Object lock1 = new Object();
Object lock2 = new Object();
public void method1() {
synchronized(lock1) {
...
}
}
public void method2() {
synchronized(lock2) {
...
}
}
這樣做,你從this
更改同步鎖定對象lock1
爲method1
併爲lock2
爲method2
請記住,鎖在實例級而非類級別工作。對於A
的每個實例,最多一個在method1
和method2
之間可以在任何給定時刻運行。
然而,如果有的A
兩個不同的實例,例如a1
和a2
,a1.method1()
可以運行交錯用a2.method1()
(或a2.method2()
)。
不,同步鎖定一個對象,而不僅僅是該方法。一旦一個線程訪問了一個同步的方法,那個類中的其餘方法(同步或非同步)就不能再被任何其他線程訪問,直到正在運行的線程進入可運行狀態,在該狀態下鎖可用於下一個線程獲取。
所以我相信你問的問題是:「如果我同時使用這兩種方法,兩個不同的線程能夠訪問兩種不同的同步方法嗎?」
答案是,這取決於。
與您提供的語法同步發生在實例級別。
因此,如果線程1和線程2訪問相同的實例,然後否。 線程2被鎖定,直到線程1可以處理。
但是,如果線程1和線程2訪問不同的實例,那麼YES。 線程2不必等到線程1完成,因爲實例不同。用於同步
更多的參考資料:
如果存在即a1和a2,a1的兩個實例可以在同一時間只訪問方法1或方法2。 – user3677652
無法理解你的觀點......它不是* *訪問方法1或方法2。當我們談論訪問時,我們正在討論線程而不是對象 – Raffaele
我試圖更加準確地將它描述爲「*實例方法在實例級別上工作*」,因爲'static'方法上的'synchronized'確實可以工作在班級一級。 –