让我重新审视这个在阅读文档时无法解决的问题的部分是:
如果有许可证,则将其消耗掉,并立即返回呼叫...
因此,当许可证“可用”时,谁以及如何使它可用,以便可以立即使用它?这在某种程度上是微不足道的:
public static void main(String[] args) {
Thread parkingThread = new Thread(() -> {
System.out.println("Will go to sleep...");
sleepTwoSeconds();
System.out.println("Parking...");
LockSupport.park();
System.out.println("After parking...");
});
parkingThread.start();
sleepOneSecond();
System.out.println("Un-parking...");
LockSupport.unpark(parkingThread);
}
private static void sleepTwoSeconds() {
try {
Thread.sleep(1000 * 2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static void sleepOneSecond() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
该代码说明了一切,thethread
正在运行但尚未调用LockSupport.park
,而其他一些线程LockSupport.unpark
在其上调用-因此使该许可可用。之后我们打电话LockSupport.park
,因为有许可证就立即返回。
一旦考虑了一下,这将有些危险,如果将线程暴露给您无法控制的代码,LockSupport.unpark
并且park
此后调用该代码,则可能无法正常工作。