你能帮助我吗? 当我想确保只有一个线程修改队列时,是否需要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