Java 如何在使用类的某个方法时锁定该类的所有方法?
我不明白如何用Java做这件事: 例如,我有Foo.class: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
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
关键字将在当前对象上同步。但是,他希望阻止对不同对象的并发调用。