2017-06-04 224 views
1

我看到很多使用'synchronized'實現'run'的IdleConnectionMonitorThread的例子。在我看來,這是沒有意義的。 在爲什麼IdleConnectionMonitorThread需要同步

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並以這種方式,同步使用它(這)沒有任何意義。

IdleConnectionMonitorThread idleConnectionMonitorThread = new IdleConnectionMonitorThread(poolingHttpClientConnectionManager) 

我不知道使用 '同步' 的好處,可以使用這種方式實現的run(刪除同步)

 @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

閱讀javadocsObject.wait(long)

如果您在未持有您正在等待的互斥鎖時調用它,則會發生異常。 javadoc狀態:

拋出:IllegalMonitorStateException - 如果當前線程不是對象監視器的所有者。

通常,在「等待/通知」協議中鎖定互斥鎖對於確保正在管理的共享狀態對所有正在參與的線程均可見是至關重要的。在這種情況下,shutdown變量被聲明爲volatile,所以這不是一個問題。然而,「等待/通知」協議要求反正;往上看。

我不知道使用​​的好處,可以使用這種方式運行(刪除同步)。

沒有。如果您刪除​​,則會發生異常。但是你可以用Thread.sleep(...)替換Object.wait(...) ...然後​​就沒有必要了。


至於這段代碼的「奇怪」,誰知道作者爲什麼以此結束。但它真的很重要嗎?有一個工程原理:「如果沒有損壞,請不要修復」。沒有人提出這個代碼被破壞的原因。

+0

這段代碼對我來說似乎很陌生。沒有任何通知會繼續,如果這個連接管理器沒有設計爲從多個線程安全地調用它,那將是很奇怪的。那麼誰會知道寫它的人在想什麼? –