gpt4 book ai didi

java - 我可以使用 Collection.size() 来替换这段代码中的计数器吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:30 26 4
gpt4 key购买 nike

代码如下:

public class LogService {
private final BlockingQueue<String> queue;
private final LoggerThread loggerThread;
private final PrintWriter writer;
@GuardedBy("this") private boolean isShutdown;
@GuardedBy("this") private int reservations; // <-- counter
public void start() { loggerThread.start(); }
public void stop() {
synchronized (this) { isShutdown = true; }
loggerThread.interrupt();
}
public void log(String msg) throws InterruptedException {
synchronized (this) {
if (isShutdown)
throw new IllegalStateException(...);
++reservations;
}
queue.put(msg);
}
private class LoggerThread extends Thread {
public void run() {
try {
while (true) {
try {
synchronized (LogService.this) {
if (isShutdown && reservations == 0)
break;
}
String msg = queue.take();
synchronized (LogService.this) {
--reservations;
}
writer.println(msg);
} catch (InterruptedException e) { /* retry */ }
}
} finally {
writer.close();
}
}
}
}

这是 Java Concurrency in Practice 一书的片段,我在想也许计数器 reservations 是不必要的,因为我们可以简单地使用 queue .size() 获取 queue 中元素的数量。

我说得对吗?

最佳答案

不,这实际上会造成死锁。

如果您想以并行方式使用size,则需要同步puttake。但是 take 是阻塞的,您现在可以在与 put 调用相同的对象上同步阻塞 take 调用。 takeput 之前不能接受。 put 不能放,直到take 放弃锁。这是一个僵局。

关于java - 我可以使用 Collection.size() 来替换这段代码中的计数器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33864352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com