我无法理解如何在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的呼叫?
谢谢你的支持!
答案 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) {
}
}