我使用LinkedBlockingQueue處理來自其他線程的消息對象。例如,我有這樣的事情:Java:使用對象列表同步put()
LinkedBlockingQueue<Message> message_queue = new LinkedBlockingQueue<Message>();
public void run(){
while(true){
Message m = message_queue.take();
handle_message(m);
}
}
當我從另一個線程添加一個新的消息,我打電話message_queue.put(M)。沒問題!我的問題是這樣的:
如何同時添加一組消息?比方說,我想這樣做:
Message[] messages = {/* some list of message objects */};
for (Message m : messages){
message_queue.put(m);
}
的問題是,另一個線程可以做同樣的事情,並從一個線程的消息不能保證,因爲我打算準確地排隊。來自競爭線程的消息可以在它們之間「交錯」(即,實際的序列可以最終成爲A,A,B,B,A,B而不是預期的A,A,A,B,B,B)可以將循環放在「put」示例中的「synchronized(message_queue){}」塊中,但是我是否也需要將相同的塊放到.take()的調用中?顯然,我不能這樣做,因爲它會立即創建一個死鎖情況,因爲take()阻塞,直到放入一個新的消息(),這在鎖定同步時不會發生。我可以跳過take()調用中的同步塊,在put循環中只有一個同步塊,並獲得所需的效果嗎?謝謝!
同意:唯一的順序問題是2次大宗投機操作相互衝突或單次投放操作。 – 2009-08-11 16:39:24