gpt4 book ai didi

java - 为什么IdleConnectionMonitorThread需要同步

转载 作者:行者123 更新时间:2023-11-30 06:41:13 25 4
gpt4 key购买 nike

我看到很多 IdleConnectionMonitorThread 在“run”的实现中使用“synchronized”的例子。在我看来,这没有任何意义。

中的实现

edu.uci.ics crawler4j 4.2

public class IdleConnectionMonitorThread extends Thread {

private final PoolingHttpClientConnectionManager connMgr;
private volatile boolean shutdown;

public IdleConnectionMonitorThread(PoolingHttpClientConnectionManager connMgr) {
super("Connection Manager");
this.connMgr = connMgr;
}

@Override
public void run() {
try {
while (!shutdown) {
synchronized (this) {
wait(5000);
// Close expired connections
connMgr.closeExpiredConnections();
// Optionally, close connections that have been idle longer than 30 sec
connMgr.closeIdleConnections(30, TimeUnit.SECONDS);
}
}
} catch (InterruptedException ignored) {
// terminate
}
}

public void shutdown() {
shutdown = true;
synchronized (this) {
notifyAll();
}
log.warn("newPosition: shutdown idleMonitorThread");

}

}

由于大多数情况下我们只有一个IdleConnectionMonitorThread并以这种方式使用它,所以synchronized(this)没有任何意义。

IdleConnectionMonitorThread idleConnectionMonitorThread = new IdleConnectionMonitorThread(poolingHttpClientConnectionManager)

我想知道使用'synchronized'的好处,可以用这种方式运行implement run(删除synchronized)

      @Override
public void run() {
try {
while (!shutdown) {
wait(5000);
// Close expired connections
connMgr.closeExpiredConnections();
// Optionally, close connections that have been idle longer than 30 sec
connMgr.closeIdleConnections(30, TimeUnit.SECONDS);
}
} catch (InterruptedException ignored) {
// terminate
}
}

最佳答案

阅读javadocs对于Object.wait(long)

如果在没有持有正在等待的互斥体时调用它,则会出现异常。 javadoc 指出:

Throws: IllegalMonitorStateException - if the current thread is not the owner of the object's monitor.

一般来说,在“等待/通知”协议(protocol)中锁定互斥体对于确保正在管理的共享状态对于所有参与的线程都是可见的至关重要。在本例中,shutdown 变量被声明为 volatile ,因此不必担心。然而,“等待/通知”协议(protocol)无论如何都需要锁定;见上文。

I wonder the benefit of using synchronized, can use implement run in this way (delete the synchronized).

不。如果您删除了synchronized,您将收到异常。但是您可以将 Object.wait(...) 替换为 Thread.sleep(...) ...然后 synchronized 将没有必要。

<小时/>

至于这段代码的“奇怪”之处,谁知道作者为什么会这样做。但这真的重要吗?有一条工程原则:“如果它没有损坏,就不要修理它”。。没有人提出这个代码被破坏的原因。

关于java - 为什么IdleConnectionMonitorThread需要同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44349872/

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