我有一个应用程序使用读写锁来阻止在调用所谓的“重新连接”方法时运行其他方法。现在,我希望这种“重新连接”方法一次只能被调用一次。例如,当Thread1调用“reconnect”并且正在执行“reconnect”时,Thread2会调用它,它会立即返回或等待直到Thread1的调用完成然后返回。 (导致只执行一次)。您可以想象我有一个与某些API交互的应用程序,当我的会话超时时,它需要重新连接但我不希望每个线程都创建一个新连接,因为这完全没必要。我希望我提供了足够的信息。
答案 0 :(得分:5)
Synchronized关键字可防止多个线程同时执行该功能。然后,您只需要检查方法中的连接状态。
public synchronized void reconnect() {
if (!connection.isActive()) { // this method will depend on what type of connection you have
// your code ...
}
}
基本上,如果连接已经处于活动状态,您只需要将reconnect()作为无操作。
答案 1 :(得分:4)
最好维护一个锁定对象并在其上进行同步,例如:
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
个实例。
答案 2 :(得分:0)
我可能不会使用直接锁定。
我只使用一个线程来处理所有连接/重新连接操作和队列请求对象。这有点复杂,但是:
它更灵活,因为这样的mechansim会允许两者 同步和异步请求/回复。
调试更容易,因为只会发生连接/重新连接 串口一线。
如果有的话,很容易为[其他]添加额外的连接 需要或接受。
可以检测到超时,保持活动和连接问题,以及 记录/纠正,即使没有未完成的请求。
对可能阻止某些操作的操作进行简单的硬锁定 延长时间太令人担忧了。
也许只是我...... :)。
答案 3 :(得分:-2)
您需要一个标志和同步:
private boolean mReconnectNeeded;
public synchronized void reconnectIfNeeded() {
if (mReconnectNeeded) {
mReconnectNeeded = false;
// reconnect; if it fails, set the flag again
}
}
public synchronized void setReconnectNeeded() {
mReconnectNeeded = true;
}