如何在使用其中一个时锁定所有类的方法?

时间:2015-11-16 21:48:11

标签: java multithreading

我无法理解如何在Java中做这件事:

例如,我有Foo.class:

public class Foo{
  public Foo(){}

  public void method1(){
    ...
  }

  public void method2(){
    ...
  }

}

我有自己的Foo类对象的不同线程:

Thread 1: Foo foo1 = new Foo();
Thread 2: Foo foo2 = new Foo();

例如,线程1调用:foo1.method1() 同时线程2调用:foo2.method2()

如何在线程1中的foo1.method1()未完成之前阻止线程2的呼叫?

谢谢你的支持!

3 个答案:

答案 0 :(得分:2)

你需要一些东西来同步,你可以使用很多东西,但我要添加一个类字段(所有实例共享的字段 - 也就是一个static字段)并使用它。像

这样的东西
public class Foo{
  static final Object ai = new Object(); // <-- one to rule them all...
  public Foo(){}

  public void method1(){
    synchronized(ai) {
      // ...
    }
  }

  public void method2(){
    synchronized(ai) {
      // ...
    }
  }
}

答案 1 :(得分:1)

在Java中,有一种使用synchronized块的好方法。

Synchronized关键字为对象创建内部锁(Monitor lock),通过该对象,单个线程一次只能访问一次对象,因此不能由不同的线程同时访问它。

public class Foo{
  public Foo(){}

  public synchronized void method1(){
    ...
  }

  public synchronized void method2(){
    ...
  }
}

以上编辑应该可以解决问题。因此,当您的线程正在访问您的method1()时,任何其他线程都无法访问您的method2()。

第二种方法是在类

中创建同步块
public void method1(){
  synchronized(this){
    ...
  }
}

这实际上是使用synchronized块进行任何低级同步的更好方法。谢谢。

答案 2 :(得分:1)

可能是像

这样的静态对象
static final Object myLock = new Object();

然后同步该对象上所有方法的主体(甚至更好,只是相关部分),如:

void method1() {
    synchronized (myLock) {

    }
}

void method2() {
    synchronized (myLock) {

    }
}