【问题标题】:Java Locks and ConditionsJava 锁和条件
【发布时间】:2014-06-07 15:44:45
【问题描述】:

假设我有三个线程,线程 1、线程 2 和线程 3 都共享同一个锁。线程 2 获取锁,做一些工作,然后通过调用 await 方法阻塞。然后线程 1 获得锁,做一些工作,在它的中间,线程 3 尝试获得锁,但由于线程 1 持有它而被阻塞。线程 1 完成工作,并在终止之前向线程 2 发出信号,表明它可以重新获取锁。那么会发生什么呢?接下来是线程 2 还是线程 3 获取锁?

非常感谢您的宝贵时间和提前帮助。

【问题讨论】:

标签: java multithreading locking


【解决方案1】:

如果没有优先级,谁先获得锁。

虽然mutual exclusion 可以提供safety 属性,但它不能确保liveness 属性。在某些情况下,一个线程一直先获取锁,导致starvation(其他线程永远等待,因为有人一直占用)。

突出显示关键字的 Google 将帮助您了解更多信息。我发现这些幻灯片非常全面http://www.cs.cornell.edu/Courses/cs414/2004su/slides/05_schedule.pdf

【讨论】:

    【解决方案2】:

    如果您使用 ReentrantLock(或其任何子类),则可以将“公平”标志传递给构造函数。如果设置为 true,这将确保锁的控制权传递给等待时间最长的线程,在这种情况下是您的线程 1。

    Lock lock = new ReentrantLock(true);
    

    【讨论】:

      猜你喜欢
      • 2016-02-29
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      相关资源
      最近更新 更多