Java,创建一个一次只能调用一次的方法

时间:2014-04-24 18:13:22

标签: java multithreading locking

我有一个应用程序使用读写锁来阻止在调用所谓的“重新连接”方法时运行其他方法。现在,我希望这种“重新连接”方法一次只能被调用一次。例如,当Thread1调用“reconnect”并且正在执行“reconnect”时,Thread2会调用它,它会立即返回或等待直到Thread1的调用完成然后返回。 (导致只执行一次)。您可以想象我有一个与某些API交互的应用程序,当我的会话超时时,它需要重新连接但我不希望每个线程都创建一个新连接,因为这完全没必要。我希望我提供了足够的信息。

4 个答案:

答案 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;
}