CompletableFuture 的 Signaller 实现是不是有并发问题?

252 天前
 JingSmith

我看 CompletableFuture 的 Signaller 实现是不是有并发问题,会导致线程永久阻塞?具体代码是 tryFire 方法中的 LockSupport.unpark(w); 在 block 方法的 while (!isReleasable()) { 之后 LockSupport.park(this); 之前执行,线程就永久阻塞了。

我看 GPT 也认同了我的观点,这是我理解错了还是他真有 bug ?

839 次点击
所在节点    程序员
2 条回复
JingSmith
252 天前
没 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);

}
```
yeqizhang
251 天前
学习了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1024329

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX