互斥锁的互斥访问

时间:2013-08-15 08:19:43

标签: java multithreading mutex synchronized-block

我的代码在循环中包含synchronized块,类似

while (true) {
    synchronized (SOME_MUTEX) {
            //some more code here
   }
}   

还有另一个运行代码的线程与同一个互斥锁同步。 上面的线程只读,另一个只写。写作线程正在挨饿,因此更新不会通过。即使是一两秒钟也没问题,但写作线程似乎无限期地被遗漏了。

我肯定地知道,当这个循环执行时,另一个线程也试图获取互斥锁,我确实理解为什么在执行上述线程时它没有收到它,除了while循环到达的时间它的结束,并开始一个新的迭代。

此时互斥锁应该释放,不应该吗?其他线程不应该在此时收到它吗?

谢谢

1 个答案:

答案 0 :(得分:1)

  

while循环到达终点,然后重新开始迭代。在这一点上,互斥量应该释放,不应该发布吗?

  

此时其他线程不应该接收它吗?

没有。这两个线程有​​相同的机会来获取锁,因此另一个线程可能永远无法访问同步块。

为了给你有意义的建议,我们需要了解你的目标。例如,如果在synchronized块中有一个变量,它携带一些数据,在第一个线程将新数据写入变量之前必须由另一个线程读取,那么你必须声明另一个布尔变量,它告诉变量是可用于写入,第一个线程应该在循环中等待,直到它变为真。实际上,这是一个容量为1的队列,因此最好使用像ArrayBlockingQueue这样的现成实现。

所附

"两个线程有​​相同的机会获得锁定" - 实际的机会取决于环境 - 操作系统如何工作以及处理器的繁忙程度。当达到synchronized语句的右大括号时,另一个(被阻止的)线程从队列移动到监视器到队列到处理器。如果有可用的处理器,它会立即开始尝试获取锁定。同时,第一个线程进入循环的开始并尝试获取锁定。由于第一个线程已经在处理器上,因此它有更好的机会,除非其处理器上发生某些外部中断(来自硬件定时器或任何其他设备)。

但是对于程序员来说,这一切都没什么意义。无论案件有多大概率,他都必须在两种情况下都能正确运行该计划。这就是为什么我第一次写道线程有相同的机会。