我的代码在循环中包含synchronized
块,类似
while (true) {
synchronized (SOME_MUTEX) {
//some more code here
}
}
还有另一个运行代码的线程与同一个互斥锁同步。 上面的线程只读,另一个只写。写作线程正在挨饿,因此更新不会通过。即使是一两秒钟也没问题,但写作线程似乎无限期地被遗漏了。
我肯定地知道,当这个循环执行时,另一个线程也试图获取互斥锁,我确实理解为什么在执行上述线程时它没有收到它,除了while循环到达的时间它的结束,并开始一个新的迭代。
此时互斥锁应该释放,不应该吗?其他线程不应该在此时收到它吗?
谢谢
答案 0 :(得分:1)
while循环到达终点,然后重新开始迭代。在这一点上,互斥量应该释放,不应该发布吗?
是
此时其他线程不应该接收它吗?
没有。这两个线程有相同的机会来获取锁,因此另一个线程可能永远无法访问同步块。
为了给你有意义的建议,我们需要了解你的目标。例如,如果在synchronized块中有一个变量,它携带一些数据,在第一个线程将新数据写入变量之前必须由另一个线程读取,那么你必须声明另一个布尔变量,它告诉变量是可用于写入,第一个线程应该在循环中等待,直到它变为真。实际上,这是一个容量为1的队列,因此最好使用像ArrayBlockingQueue这样的现成实现。
所附
"两个线程有相同的机会获得锁定" - 实际的机会取决于环境 - 操作系统如何工作以及处理器的繁忙程度。当达到synchronized语句的右大括号时,另一个(被阻止的)线程从队列移动到监视器到队列到处理器。如果有可用的处理器,它会立即开始尝试获取锁定。同时,第一个线程进入循环的开始并尝试获取锁定。由于第一个线程已经在处理器上,因此它有更好的机会,除非其处理器上发生某些外部中断(来自硬件定时器或任何其他设备)。
但是对于程序员来说,这一切都没什么意义。无论案件有多大概率,他都必须在两种情况下都能正确运行该计划。这就是为什么我第一次写道线程有相同的机会。