Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在使用类的某个方法时锁定该类的所有方法?_Java_Multithreading - Fatal编程技术网

Java 如何在使用类的某个方法时锁定该类的所有方法?

Java 如何在使用类的某个方法时锁定该类的所有方法?,java,multithreading,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.m

我不明白如何用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的调用


非常感谢你

您需要一些东西来进行同步,您可以使用很多东西,但我会添加一个class字段(一个由所有实例共享的字段,也称为
静态
字段)并使用它。差不多

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) {
      // ...
    }
  }
}
公共类Foo{

静态最终对象ai=new Object();//在Java中,有一种很好的方法可以使用synchronized block实现这一点

Synchronized关键字为对象创建内部锁(监视器锁),通过该锁,单个线程一次只能访问一次对象,因此不同线程不能同时访问该对象

public class Foo{
  public Foo(){}

  public synchronized void method1(){
    ...
  }

  public synchronized void method2(){
    ...
  }
}
上面的编辑应该可以做到这一点。因此,当线程访问method1()时,任何其他线程都不能访问method2()

第二种方法是在类内创建同步块

public void method1(){
  synchronized(this){
    ...
  }
}

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

可能是一个静态对象,如

static final Object myLock = new Object();
然后同步该对象上所有方法的主体(或者更好,只是相关部分),如:

void method1() {
    synchronized (myLock) {

    }
}

void method2() {
    synchronized (myLock) {

    }
}

@ControlAltDel,简单地使所有方法
同步化
并不能完全满足OP的要求:如果调用用于不同的实例,它不会阻止对两个不同方法的重叠调用。这里可能有一个XY问题:OP没有解释真正的问题是什么。您需要clas之外的全局锁s、 然后,当调用一个方法时,它将锁定锁(如果锁已锁定,则会阻止),并在线程退出时解锁锁。如果当时没有其他人,我将在大约4小时内写出完整答案(现在无法给你完整答案b/c我在手机上)。请注意,我的建议可能不是最好的。我的建议只需要对现有代码进行最少的更改。这不是op所要求的。
synchronized
关键字将在当前对象上同步。但是,他希望阻止对不同对象的并发调用。