直接可访问的数据结构 Java

12 浏览
0 Comments

直接可访问的数据结构 Java

我有以下情况:

  1. 一个只能扩展的数据结构(我只能在尾部添加元素)
  2. 我需要能够跟踪已经看过的元素(我有一个索引,理想情况下,我希望能够从特定元素重新遍历列表)
  3. 阅读操作永远不会阻塞,并且添加新元素只会锁定队列的尾部而不是整个队列

这是一个被多个线程频繁修改的结构。对于这个情况,哪种数据结构最好?

ArrayList。这个结构能够直接通过索引访问最后一个元素,但会引发并发修改异常。可以将其设置为同步,但希望避免锁定(除了最后一个元素外,其他地方都没有并发写入新元素的情况)

ConcurrentLinkedQueue。这个结构可以解决并发问题,但问题是我需要存储当前迭代的位置而不是整数索引。它返回的是一个弱一致性迭代器,不能保证返回自创建迭代器以来已添加到列表中的新对象(来源:javadoc)

ConcurrentHashMap以索引作为键。这个结构的好处是可以直接访问与正确索引对应的数据,但问题是没有一个“getNext”操作符能够让我有效地遍历从索引到索引+1等的元素

Vectors。这个结构可以解决大部分问题,不会抛出并发修改异常,并且允许直接访问。但是,由于所有方法都是同步的,性能与ArrayList相比较差。考虑到我只想扩展结构,而不是在中间插入记录,我不愿选择这种性能较差的解决方案,其中读取操作也会受到性能影响(而在我的用例中,元素的索引实际上永远不会改变,因此不需要同步不是尾部的读取操作)

自定义数据结构:保持一个要存储的对象数组和一个指向此数组尾部(最后一个设置的)的指针,当插入新对象时,锁定尾部和尾部指向的对象。当对象超过当前大小时,进行锁定的调整大小操作。

哪种策略是最好的/是否有其他更高效的实现?

0