2014-10-19 87 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