当前位置: 首页 > 知识库问答 >
问题:

可直接访问的数据结构Java

汤乐家
2023-03-14

我有以下情况:

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

这是一个由多个线程大量修改的结构。

最佳的数据结构是什么?

ArrayList.如果能够直接访问使用索引看到的最后一个元素,这将是理想的,但它会导致html" target="_blank">并发修改异常。我可以使它同步,但希望避免锁定(或者除了最后一个元素之外的任何锁定,因为它是唯一一个可以并发写入以添加新元素的元素)

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

以索引作为键的ConcurrentHashMap。这样做的好处是,我可以直接访问对应于正确索引的数据,但问题是没有“getNext”操作符允许我高效地从索引、到索引+1等遍历元素

向量这将解决我在允许一些不会抛出并发修改异常和允许直接访问的东西方面的大多数问题。但是,如果所有方法都是同步的,那么性能就会比数组列表差。考虑到我只想扩展结构,而不是在中间插入记录,我不愿意使用这种重量级的解决方案,在这种情况下读取也会受到性能的影响(而根据我的使用情况,元素的索引实际上从来不会改变,所以不需要同步不是尾部的读取)

自定义数据结构:保留一个我要存储的对象的数组和一个指向这个数组尾部(最后一个元素集)的指针,在插入新对象时,锁定尾部和尾部指向的对象。当对象超过其当前大小时,执行锁定调整大小操作。

什么是最好的策略/任何其他更有效的执行?

共有1个答案

谷梁驰
2023-03-14

CopyOnWriteArrayList结构可以解决您的问题(java.util.concurrent)。

>

  • CopyonWriteArrayLists是线程安全的,因为所有更改操作都是通过创建列表的副本来实现的。

    避免了ConcurrentModificationException的问题,因为在迭代时数组不会更改。所谓的快照样式迭代器在创建迭代器时使用对数组状态的引用。

    如果读取的内容比写入的内容多得多,请使用copyonwritearraylist,否则请使用vector

    copyonwritearraylist具有较长的写入延迟(由于复制)但没有读取延迟时,vector为每个操作引入了较小的同步延迟。

    vector在迭代时需要显式同步(因此不能同时执行写操作),copyonwritearraylist不需要。

  •  类似资料:
    • 问题内容: 有没有一种方法可以完全使用客户端Javascript访问MySql数据库,或者是否需要使用PHP或C#这样的服务器端语言? 谢谢 问题答案: 如果Javascript在浏览器中运行,则无法访问MySQL数据库。首先,这是一个技术限制,因为Javascript无法通信任意协议(不,WebSockets不是解决方案)。请注意,作为服务器端和所有端的Node.js是一种“不同类型的javas

    • 这是运行命令后发生的情况: 启动:pid=4346 port=27017 dbpath=/var/lib/mongodb/data/db 64位host=era-inspiron-5559 2017-02-12T14:39:18.644+0530 I CONTROL[initandlisten]db版本v3.4.2 2017-02-12T14:39:18.644+0530 I控件[initandl

    • 问题内容: 我正在使用NSManagedObject子类中的setValueForKey设置NSTimeInterval,该值被正确设置,并且在使用valueForKey检索该值时也是正确的,但是,如果直接使用访问器,它将返回一个不正确的值。这是演示该问题的代码示例 奇怪的是,如果将dateLastSynced转换为NSDate,则一切运行正常。 有什么想法吗? 问题答案: 类型为Core Dat

    • 问题内容: 到目前为止,我们使用了几个Linux用户: system_foo @ server system_bar @服务器 … 我们希望将系统用户放入docker容器中。 linux用户->容器 服务器内部的更改没有问题,但是远程系统使用这些用户向我们发送数据。 我们需要工作。远程系统无法更改。 如果每个linux操作系统只有一个系统(将端口22传递到容器),我将非常容易。但是有几个。 我们如

    • 问题内容: 我正在尝试直接为嵌入式Linux项目访问物理内存,但是我不确定如何最好地指定使用的内存。 如果我定期引导设备并访问/ dev / mem,则可以轻松地对其几乎任何位置进行读写。但是,在这种情况下,我正在访问可以轻松分配给任何进程的内存。我不想做 我的/ dev / mem代码是(删除了所有错误,等等。): 这可行。但是,我想使用没有其他人会碰到的内存。我尝试通过使用mem = XXXm

    • 问题内容: 我目前正在使用jOOQ访问Java中的嵌入式H2数据库以生成表类等。我目前可以执行查询,例如 在我的代码中,返回结果等。 但是我不能查询信息架构。我可以使用H2控制台正常访问它,并且为给定的information_schema表创建视图可以正常工作。我的问题是我应该如何访问information_schema例如执行查询,例如 从我的Java代码中?我是否必须创建视图,是否可以通过jo