2015-02-05 47 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(); 
     } 
    }