2013-10-12 65 views
2

Sun爲什麼不使用synchronized(this)而不是mutex = this,然後使用synchronized(mutex)?
我看不出他們做了什麼好處嗎?我錯過了什麼嗎?爲什麼SynchronizedCollection會將它分配給互斥量?

static class SynchronizedCollection<E> implements Collection<E>, Serializable { 
     private static final long serialVersionUID = 3053995032091335093L; 

     final Collection<E> c; // Backing Collection 
     final Object mutex;  // Object on which to synchronize 

     SynchronizedCollection(Collection<E> c) { 
      if (c==null) 
       throw new NullPointerException(); 
      this.c = c; 
      mutex = this; 
     } 
     SynchronizedCollection(Collection<E> c, Object mutex) { 
      this.c = c; 
      this.mutex = mutex; 
     } 

     public int size() { 
      synchronized (mutex) {return c.size();} 
     } 
     public boolean isEmpty() { 
      synchronized (mutex) {return c.isEmpty();} 
     } 
+1

儘量不要問問「Sun爲什麼要這樣做」,因爲只有Sun的開發人員才能回答這個問題。另外,你如何驗證你得到的答案是正確的?因此,這個問題可能沒有任何「正確的」答案。 – Patrick

回答

1

向客戶提供傳遞他自己的互斥對象的規定給了一個靈活的世界。客戶端可以在任意鎖定方案中涉及同步收集,涵蓋適合他的使用情況的儘可能多的代碼。如果this是唯一選項,那麼鎖粒度將固定爲集合上的一個方法調用,或者它會強制客戶端將該集合用作其互斥量,從而中斷整體設計。

0

我認爲當你想對收集的方法以及在單互斥的實現方法實現同步,讓你更安全。 也許你可以在只有一個互斥體的情況下同步許多這樣的集合!

1

這允許集合的客戶端通過第二個構造函數在單個互斥鎖上同步多個集合。

0

Collections.synchronizedMap(map).values()爲例,這應該是map互斥量上同步的Collection。還有很多其他實用程序需要在某個其他對象上同步的Collection

相關問題