LockSupport.java中的FIFO互斥代码段

LockSupport.java中的FIFO互斥代码段,java,multithreading,mutex,locks,Java,Multithreading,Mutex,Locks,我试图理解LockSupport.java,并参考了它的文档。其中有一个代码片段,作者在其中提供了一个使用LockSupport#park()和LockSupport#Unpark()实现互斥的示例 我使用该示例并创建了一个使用该示例FIFOMutex的程序 FIFOMutex代码(取自LockSupport.java) 以下是该程序的输出: Inside thread -> Thread[Thread-0,5,main]Before mutex.lock() Inside thread

我试图理解
LockSupport.java
,并参考了它的文档。其中有一个代码片段,作者在其中提供了一个使用LockSupport#park()和LockSupport#Unpark()实现互斥的示例

我使用该示例并创建了一个使用该示例FIFOMutex的程序

FIFOMutex代码(取自LockSupport.java)

以下是该程序的输出:

Inside thread -> Thread[Thread-0,5,main]Before mutex.lock()
Inside thread -> Thread[Thread-0,5,main]After mutex.lock()
Inside thread -> Thread[Thread-1,5,main]Before mutex.lock()
Inside thread -> Thread[Thread-1,5,main]After mutex.lock()
Inside thread -> Thread[main,5,main]will I get printed?
线程1启动并获取锁,然后是调用unlock()的线程2。Main调用lock()。我的理解是,Main将永远被阻塞,即使线程2调用了unlock(),因为线程2从未调用lock()(这样,它从未被授予
许可证)

我无法理解这种行为。如果我在Thread-2中注释unlock(),那么主线程将永远被阻塞


一个线程(在我的例子中是thread-2)调用unlock()(以前没有调用lock())而另一个线程(在本例中是主线程)调用lock(),但永远不会被锁定,这怎么可能呢?

如果深入研究源代码,unblock方法实际上是释放变量
locked
提供的CAS锁,并取消对第一个线程的连接。因此,如果注释掉调用
unlock()
,CAS锁不会被释放,主线程可以永远留在while循环中,这会阻塞主线程。

如果深入研究源代码,unblock方法实际上会释放变量
locked
提供的CAS锁,并取消对第一个线程的锁定。因此,如果您注释掉调用
unlock()
,CAS锁不会被释放,主线程可以永远留在while循环中,这会阻塞主线程。

首先:FIFOMutex调用

Thread current = Thread.currentThread();
这意味着实际线程用于验证。这意味着将考虑最实际的线程,即:

  • 首先是线程1,它发出锁,然后
  • 线程2被调用并发出解锁
这就是主线不会挂起的原因。
但是:如果您对线程2的解锁进行注释,则未完成任何操作,并且主线程挂起。这很容易理解,不是吗?

首先:FIFOMutex调用

Thread current = Thread.currentThread();
这意味着实际线程用于验证。这意味着将考虑最实际的线程,即:

  • 首先是线程1,它发出锁,然后
  • 线程2被调用并发出解锁
这就是主线不会挂起的原因。 但是:如果您对线程2的解锁进行注释,则未完成任何操作,并且主线程挂起。这很容易理解,不是吗

Thread current = Thread.currentThread();