我有一个应用程序,它使用读写锁来防止在调用所谓的“重新连接”方法时运行其他方法。现在,我希望这个“重新连接”方法一次只被调用一次。例如,当Thread1调用“reconnect”时,当“reconnect”正在执行时,Thread2调用它,它要么立即返回,要么等待Thread1调用完成然后返回。 (导致仅执行一次)。正如您可能想象的那样,我有一个与某些 API 交互的应用程序,当我的 session 超时时,它需要重新连接,但我不希望每个线程都创建一个新连接,因为这是完全没有必要的。我希望我提供了足够的信息。
最佳答案
最好维护一个锁对象并对其进行同步,例如:
public class MyClass {
private final Object lock = new Object();
public void reconnect() {
synchronized(lock) {
....
}
}
....
}
原因是,当您在方法签名中使用synchronized关键字时,您实际上是在MyClass
上进行同步。实例。问题是,类之外的任何其他代码也可以这样做。例如,
public class SomeOtherClass {
public void go(final MyClass myClass) {
synchronized(myClass) {
wait(Integer.MAXIMUM_VALUE);
}
}
}
现在如果其他线程想要调用 myClass.reconnect()
,他们不能,因为SomeOtherClass
已锁定myClass
实例。
关于Java,制作一个一次只能调用一次的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23276665/