我有以下情況:直接訪問數據結構的Java
- 的數據結構永遠只能延長(我只 在尾部添加的東西)
- 我需要能夠保持跟蹤哪些元素我已經看到了 (我有一個索引,理想情況下我希望能夠從這個特定元素再次遍歷列表)
- 我希望讀取永遠不會被阻塞, 新的元素只有永遠lo ck隊列的尾部而不是 整個隊列
這是一個被多個線程嚴重修改的結構。
什麼是最好的數據結構呢?
ArrayList。這可以直接訪問使用索引看到的最後一個元素,但這會導致併發修改異常。我可以使它同步,但希望避免鎖定(或除了最後一個元素之外的任何鎖定,因爲它是唯一一個可能會同時寫入以添加新元素的地方)
ConcurrentLinkedQueue。這將解決我的併發問題,但存在的問題是我必須存儲迭代的當前位置而不是整數索引。這具有返回弱一致的迭代器這是不保證返回已添加到列表中,因爲迭代器創建(來源:javadoc的)新對象的問題
ConcurrentHashMap的與索引鍵。這樣做的好處是我可以直接訪問與正確索引對應的數據,但存在的問題是沒有「getNext」運算符,這將使我可以有效地遍歷從索引到索引+1的元素,等等。
Vectors這將解決我的大部分問題,以允許某些不會拋出併發修改異常並允許直接訪問的內容。但是,由於所有方法都是同步的,與陣列列表相比,性能差。鑑於我只想擴展結構,而不是在中間插入記錄,所以我不願意選擇這個重量級的解決方案,讀取時也會受到性能影響(但是,由於我的用例,元素的索引從來沒有真正改變,因此沒有必要同步讀取不是尾)
自定義數據結構:保持我要存儲對象的數組和指針數組的尾部(最後一個元素設置),當插入一個新對象時,鎖定尾部和尾部指向的對象。當對象超出其當前大小時,執行到鎖定大小調整操作。
什麼是最好的戰略/任何其他更有效的實施?
您可以使用java.util.Vector而不是ArrayList。這將解決您的同步問題。 – sk2212 2013-04-25 09:34:08
+1爲您的研究努力。 – 2013-04-25 09:35:06
@ user1018513你的意思是「我需要能夠跟蹤我已經看到的元素」。你能否多解釋一下? – Eugene 2013-04-25 09:36:03