2014-10-19 50 views
1

我有一个LinkedBlockingQueue,以及一些对它进行操作的线程。关于LinkedBlockingQueue采取方法的说明

public void run(){ 
    ... 
     foo(linkedBlockingQueue.take()); 
    ... 
    } 

    public void foo(Object o){ 
     synchronized(o){ 
       //operate on the object 
       .... 
       //after operate re-insert the object inside the queue 
     } 
    } 

,如果我有这样的情况:

一个阻塞队列具有5种元素和“幸运”线程已经获得的第一个元素,以便控制:

  • 其他线程同时想要第一个元素将放入wait
  • 如果第一句是正确的,那么使用​​块是没有用的?
  • 其他线程在拾取第一个元素时可以访问间隔中的其他位置,并且在没有mutex exclusion的情况下插入这个元素?

在此先感谢。

回答

3

一个阻塞队列具有5种元素和“幸运”线程已获得 第一个元素,以便控制:

other threads that concurrently wanted the first element will put in wait?. 

否,其他线程会得到第二,第三等直到队列为空。只有在这种情况下,他们才会阻止。

it is useless to use a synchronized block if the first sentence is right? 

这个问题的答案已经无关回答第一个问题。如果您在单个线程中处理采集的对象或者是不可变的,那么是的,不需要同步,但是否则可能需要同步。其他

线程可以在间隔访问的其它位置时拾取 第一元件和这一个的插入不互斥 排斥?

你问是否其他线程可能会从队列中获取更多元素,直到重新添加第一个元素为止?是的,队列没有被锁定,它可以从其他线程访问。

+0

感谢您的回答,我现在明白了。take方法是原子的,自然而然,但并不阻止其他线程获取其他元素 – 2014-10-19 15:59:34