【问题标题】:Calling signal() when one thread is suspended in retaining the lock and other in await() who will enter the CS?当一个线程挂起保持锁而另一个线程在await()时调用signal()谁将进入CS?
【发布时间】:2017-08-03 18:39:59
【问题描述】:

假设有 3 个线程 t1, t2, t3

我有这段代码(Condition con = lock.newCondition();):

lock.lock();
if (Thread.currentThread().getName().equals("t1"))
    con.await();
if (Thread.currentThread().getName().equals("t2"))
    con.signal(); 
lock.unlock(); 

t1 首先运行此代码,然后 t2 和 t3 在 lock.lock(); 中暂停。
t1执行con.await();后t2进入并执行con.signal();

我的问题是信号之后谁会进入临界区?
是t1因为await()而被挂起还是t3在lock.lock();中挂起?

Oracles 文档指出:

如果有任何线程正在等待此条件,则选择一个 起来。该线程必须在返回之前重新获取锁 从等待。

从最后一句是不是说在 t1 苏醒后它与 t3 在锁上竞争?
如果是这样,可以保证t1,t3中的谁会进入吗? 假设我没有在 lock 的构造函数中传递 true(表示公平锁)。

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    是的,你是对的 - 如果不公平,则绝对不能保证会选择哪个线程 - t1 of t3;他们确实会争夺资源。

    顺便说一句,不仅这里如此,通常线程调度也是如此 - 无论是同步块、CAS、自旋锁等。公平真的 > 昂贵且很少使用(至少到目前为止我还没有案例)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      相关资源
      最近更新 更多