Java,制作一个一次只能调用一次的方法

标签 java multithreading locking

我有一个应用程序,它使用读写锁来防止在调用所谓的“重新连接”方法时运行其他方法。现在,我希望这个“重新连接”方法一次只被调用一次。例如,当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/

相关文章:

java - log4j2 文件已创建但未写入

c# - Microsoft 代码片段等待 System.Threading.Thread 完成

python - 在 Python 中使用 MySQL 表作为线程队列

java - 我应该使用什么同步原语来实现 Java 中的事件驱动程序框架?

java - 带有 JRE 7 的 Eclipse Juno 会导致启动问题

java - Android - 实现类似 Instagram 的编辑文本框

c# - 我如何使用线程在 XNA 中运行数据库查询?

php - SQLite 数据库已锁定,但仅适用于从在命令行运行的 PHP 脚本插入

sql-server - 了解 SQL Server 中的六锁

java - 如何在java中使用spark从AWS S3读取.xls文件?并且无法读取sheetName