由ConcurrentLinkedQueue扯到線程安全 待整理


前幾天項目總是報錯,找了下原因。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM