前幾天項目總是報錯,找了下原因。
ConcurrentLinkedQueue 本身是一個基於鏈接節點的無界線程安全隊列,你自己調用就不用考慮線程安全了嗎?
結論是:原子性操作當然是線程安全的,非原子性那就不安全了
原子性操作:
queue.add(obj);
or
queue.poll();
非原子性操作(這里涉及到兩個操作,在大並發的時候,在兩個方法之間,在中間這個時刻,即當調用完了queue.isEmpty()的時候,可能有人操作了queue.poll(),在當你調用queue.poll()的時候,隊列已經為空了,所以就出現異常了)
if(!queue.isEmpty()) { queue.poll(); }
應該為下面:
synchronized(queue) { if(!queue.isEmpty()) { queue.poll(); } }
參考:http://stackoverflow.com/questions/435069/java-util-concurrentlinkedqueue/435941