2015-02-05 86 views
1

你能幫助我嗎? 當我想確保只有一個線程修改隊列時,是否需要BlockingQueue?:確實BlockingQueue需要同步嗎?

BlockingQueue queue = new ArrayBlockingQueue(1024);

Collections = Collections.synchronizedCollection(queue); < ---這是必要的嗎?

+0

根據文檔它指出__Note一個,BlockingQueue可以安全地與多個生產者和使用多個消費者.__以及__BlockingQueue實現都是線程安全的。所有排隊方法都使用內部鎖或其他形式的併發控制自動實現其效果.__ – Jack 2015-02-05 19:11:06

回答

1

由於BlockingQueue是線程安全的,因此不需要同步其訪問:併發由類本身處理。

BlockingQueue javadoc狀態:

BlockingQueue實現是線程安全的。

它還提供了生產者 - 消費者的例子。

0

不,您不需要明確地指定synchronize

內部,它使用的ReentrantLock守衛訪問,

final ReentrantLock lock; 
    /** Condition for waiting takes */ 
    private final Condition notEmpty; 
    /** Condition for waiting puts */ 
    private final Condition notFull; 

Source code 對於前: -

public boolean offer(E e) { 
     checkNotNull(e); 
     final ReentrantLock lock = this.lock; 
     lock.lock(); 
     try { 
      // 
      // 
     } finally { 
      lock.unlock(); 
     } 
    }