2015-11-09 78 views
1

我想用以下方法同步Java類中的兩個方法:如果任何方法正在運行,另一個方法必須等到第一個完成才能啓動。如何同步兩種方法?

這是爲了兩種方法執行重疊的情況。

實現此目的最簡單的方法是什麼?

+5

你真的應該閱讀一個併發基礎教程。從這裏開始:https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html –

回答

6

你只需要在其上的常見顯示器同步:

private final Object monitor = new Object(); 

public void methodA() { 
    synchronized (monitor) { 
    // Do something with exclusive access. 
    } 
} 

public void methodB() { 
    synchronized (monitor) { 
    // Do something with exclusive access. 
    } 
} 

注意,普通顯示器可以是實例本身,在這種情況下,你可以簡單地添加​​方法簽名:

public synchronized void methodA() { 
    // Do something with exclusive access. 
} 
// Same for methodB. No need for `monitor`. 
+0

如果鎖定整個方法可以自動同步,那麼任何已知的缺點是什麼? – StackOverflower

+0

你的意思是爲方法簽名添加'synchronized'?我能想到的主要原因是隨後添加到該類的任何其他'synchronized'方法也會阻止訪問'methodA'和'methodB'。 –

5

兩個線程互斥,你可以這樣做:

private final Object mutex = new Object(); 

void f() { 
    synchronized (mutex) { 
     ... 
    } 
} 

void g() { 
    synchronized (mutex) { 
     ... 
    } 
} 

注意如果在同步塊f調用g它不會被阻止。 (這將是無論如何死鎖。)

你也可以將方法同步,而沒有mutex

synchronized void f() { } 
synchronized void g() { } 

這確實對this同步。

0

有更多的方法如何做到這一點: - 第一種方法是使用monitors - 或sempahores。它是獨佔訪問,稱爲臨界區(如:共享資源等,同步),「互斥方式」

其次是有用的,最簡單的可能是使用notify()wait() - (若無物上面,只是用synchronize ) - 對於this look there 更多關於顯示器和使用你可以read there