我看 CompletableFuture 的 Signaller 实现是不是有并发问题,会导致线程永久阻塞?具体代码是 tryFire 方法中的 LockSupport.unpark(w); 在 block 方法的 while (!isReleasable()) { 之后 LockSupport.park(this); 之前执行,线程就永久阻塞了。
我看 GPT 也认同了我的观点,这是我理解错了还是他真有 bug ?
1
JingSmith OP 没 bug ,先 unpark 的话,下次 park 会失效,应该是有个标志位,能抵消一次 park
```java @Test public void test() throws InterruptedException { Thread thread = new Thread(() -> { try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("start park in thread 1"); LockSupport.park(Thread.currentThread()); System.out.println("start park in thread 2"); LockSupport.park(Thread.currentThread()); System.out.println("end park in thread"); }); thread.start(); TimeUnit.SECONDS.sleep(1); System.out.println("start unpark in main"); LockSupport.unpark(thread); LockSupport.unpark(thread); System.out.println("end unpark in main"); TimeUnit.SECONDS.sleep(4); LockSupport.unpark(thread); TimeUnit.SECONDS.sleep(100); } ``` |
2
yeqizhang 253 天前
学习了
|