为什么IdleConnectionMonitorThread需要同步

时间:2017-06-04 01:02:36

标签: java apache-httpclient-4.x synchronized

我看到许多IdleConnectionMonitorThread使用' 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'的好处,可以用这种方式运行工具(删除同步)

      @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
        }
      }

1 个答案:

答案 0 :(得分:1)

阅读Object.wait(long)的{​​{3}}。

如果您在没有持有正在等待的互斥锁时拨打电话,您将获得例外。 javadoc声明:

  

抛出:IllegalMonitorStateException - 如果当前线程不是对象监视器的所有者。

通常,在"等待/通知"中锁定互斥锁。协议对于确保所有正在管理的共享状态对所有参与的线程都是可见的至关重要。在这种情况下,shutdown变量被声明为volatile,因此不是一个问题。然而,"等待/通知"无论如何协议需要锁定;见上文。

  

我想知道使用synchronized的好处,可以用这种方式运行工具(删除同步)。

不。如果您删除了synchronized,则会收到例外情况。但您可以将Object.wait(...)替换为Thread.sleep(...) ...然后synchronized将不再必要。

关于"奇怪"这段代码,谁知道为什么作者最终得到了这个。但它真的重要吗?有一个工程原则:"如果它没有被破坏,就不要修理它" 。没有人提出这个代码被破坏的原因。