-1

我的代码synchronized在循环中包含一个块,类似这样

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

还有另一个线程正在运行与同一个互斥锁同步的代码。上面的线程只读,另一个只写。写作线程被饿死了,所以更新没有通过。即使一两秒钟也可以,但是写作线程似乎被无限期地排除在外。

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

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

谢谢

4

1 回答 1

1

while 循环到达终点,并重新开始新的迭代。此时应该释放互斥锁,不是吗?

是的

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

不,两个线程获得锁的机会相同,因此另一个线程可能永远无法访问同步块。

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

追加

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

但是对于一个程序员来说,这一切都毫无意义。他必须在这两种情况下提供程序的正确运行,无论这些情况有多大的可能性。这就是我第一次写线程有平等机会的原因。

于 2013-08-15T08:34:31.443 回答