你能幫助我嗎? 當我想確保只有一個線程修改隊列時,是否需要BlockingQueue?:確實BlockingQueue需要同步嗎?
BlockingQueue queue = new ArrayBlockingQueue(1024);
Collections = Collections.synchronizedCollection(queue); < ---這是必要的嗎?
你能幫助我嗎? 當我想確保只有一個線程修改隊列時,是否需要BlockingQueue?:確實BlockingQueue需要同步嗎?
BlockingQueue queue = new ArrayBlockingQueue(1024);
Collections = Collections.synchronizedCollection(queue); < ---這是必要的嗎?
從文檔:「BlockingQueue實現是線程安全的。」 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html
由於BlockingQueue
是線程安全的,因此不需要同步其訪問:併發由類本身處理。
BlockingQueue實現是線程安全的。
它還提供了生產者 - 消費者的例子。
不,您不需要明確地指定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();
}
}
根據文檔它指出__Note一個,BlockingQueue可以安全地與多個生產者和使用多個消費者.__以及__BlockingQueue實現都是線程安全的。所有排隊方法都使用內部鎖或其他形式的併發控制自動實現其效果.__ – Jack 2015-02-05 19:11:06