JAVA中的锁是否保证唤醒命令

时间:2017-09-21 06:07:31

标签: java multithreading synchronization locking deadlock

您好我需要处理程序中锁定多个资源,例如:

-- Start --
Thread-1 : Lock on Res_A
Thread-2 : Lock on Res_B
Thread-3 : Lock on Res_C, Lock/Wait on Res_A(1st), Lock/Wait on Res_B(1st)
Thread-4 : Lock/Wait on Res_B(2nd), Lock/Wait on Res_C(1st)

我的问题是,如果Thread-2完成并释放Res_B上的锁,我的​​理解是Thread-3和Thread-4都可能获得锁,因为他们都在等待获取它。这可以通过公平政策来指导最长的等待线程应该获得锁定,但最终无法保证。

问题:如果我想强制执行命令等待线程根据FIFO获取锁定,JAVA是否已经像标准库中的锁一样有这种队列?否则你可以提供这种锁的第三方库或者如果必须实现自己的简单实现。

1 个答案:

答案 0 :(得分:1)

Thread-2 : Lock on Res_B
Thread-3 : Lock on Res_C, Lock/Wait on Res_A(1st), Lock/Wait on Res_B(1st)
Thread-4 : Lock/Wait on Res_B(2nd), Lock/Wait on Res_C(1st)

除非我不理解你的状态,否则这种情况永远不会发生。如果thread-2在Res_B上有一个锁,那么在等待Res_B上的锁定时,线程4无法同时锁定Res_C上的锁定}。

锁和锁/等待有什么区别?线程为BLOCKED,意味着它正在尝试获取已被另一个线程锁定的锁,或者它在监视器上为WAITING

如果您正在混合和匹配此类锁定订单,那么您正在调整死锁。我会考虑重写代码的锁定部分,看看你是否一次只能持有一个锁,或者至少以相同的顺序执行所有多锁。

  

问题:如果我想强制执行命令等待线程根据FIFO获取锁定,JAVA是否已经像标准库中的锁一样有这种队列?

Java使用底层系统线程库来实现大部分线程代码。规范中没有任何内容可以保证线程的顺序得到通知或获得锁定。也就是说,许多线程实现使用FIFO队列,尽管它们可能是优先级排序的。

那就是说,你所概述的情况永远不会发生。