我在Java类中有两个方法,我想以下列方式进行同步:如果任何方法正在运行,另一个必须等到第一个完成才能启动。
这是两种方法执行重叠的情况。
实现这一目标的最简单方法是什么?
答案 0 :(得分: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.
}
}
请注意,公共监视器可以是实例本身,在这种情况下,您只需将synchronized
添加到方法签名中即可:
public synchronized void methodA() {
// Do something with exclusive access.
}
// Same for methodB. No need for `monitor`.
答案 1 :(得分: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
上进行同步。
答案 2 :(得分:0)
有更多方法可以做到这一点: - 第一种方法是使用monitors - 或sempahores。它对于独占访问很有用,称为临界区(例如,共享资源等,同步),“互斥方式”
其次,最简单的可能是使用notify()
和wait()
- (没有上面的对象,只使用synchronize
) - 用于this look there
有关监视器和使用的更多信息,请read there