2015-11-09 79 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