如何同步两种方法?

时间:2015-11-09 13:29:03

标签: java multithreading

我在Java类中有两个方法,我想以下列方式进行同步:如果任何方法正在运行,另一个必须等​​到第一个完成才能启动。

这是两种方法执行重叠的情况。

实现这一目标的最简单方法是什么?

3 个答案:

答案 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