java - 在线程 2 进入方法 2 后,向运行线程 1 发出信号以完成方法 1

标签 java multithreading locking

我有 2 个需要按如下方式运行的方法。

method1 {
  1. run logic and insert into table1
}

method2 {
  1. wait till other threads finish method1
  2. block future threads from starting method1
  3. update table1
}

最简单的解决方案是同步方法 1 和方法 2。另一个需要考虑的点是method1可以被多个线程(>10)调用并且是常见操作,而method2很少被调用。因此,同步方法1将严重阻碍多处理能力。

我探索了使用 ReadWriteLock 的可能性,在 method1 中使用 readLock,在 method2 中使用 writeLock。但这对我在方法2中的#1没有帮助,即。在方法 2 中获取 writeLock 后,我希望方法 1 中运行的线程在继续方法 2 之前完成。

最佳答案

这是ReadWriteLock的经典用法。

参见Java Concurrency with ReadWriteLock

The read lock may be held simultaneously by multiple reader threads, so long as there are no writers. The write lock is exclusive.

因此,当您在 method2 的 #1 中请求写入锁定时,它将等到调用 method1 的任何人都释放了所有读取锁定后才获取锁定并返回。

获取写锁本质上执行方法2的#1和#2。

关于java - 在线程 2 进入方法 2 后,向运行线程 1 发出信号以完成方法 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18914738/

相关文章:

java - 将毫秒转换为小时和分钟时出现问题

java - Android 在运行的异步任务之间交换数据

c - 如何改进以下检查数字是否为素数的程序的 C 实现?

multithreading - struts Action 单例

c# - 将(结构的)实例方法传递给 ThreadStart 似乎更新了一个虚假实例,因为原始实例不受影响

java - 如何在 RESTEasy 客户端框架中设置 HTTP header ?

Java - 无需在代码中指定用户名和密码即可连接到 MySQL

java - 在 JApplet 类中使用带有 repaint() 的线程会导致其在绘制上出现 "paint"

c++ - 如何使用任意字符串作为 C++ 中的锁?

c++ - 共享内存中彼得森锁的问题