首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 6中用于并发访问列表的最佳方法

Java 6中用于并发访问列表的最佳方法
EN

Stack Overflow用户
提问于 2008-10-16 08:52:25
回答 5查看 2.6K关注 0票数 7

我有一个List对象被多个线程访问。大多数情况下只有一个线程,在某些情况下,有两个线程更新列表。根据正在处理的用户请求的数量,可以从此列表读取一到五个线程。该列表不是要执行的任务队列,而是正在同时检索和更新的域对象的列表。

现在有几种方法可以使对这个列表线程的访问安全:

-use同步块

-use普通锁(即读写操作系统共享相同的锁)

-use ReadWriteLock

-use是新的ConcurrentBLABLBA集合类之一

我的问题:

考虑到环状部分通常不包含很多操作(主要是添加/删除/插入或从列表中获取元素),那么使用的最佳方法是什么?

你能推荐另一种方法吗,上面没有列出?

若干约束

-optimal的性能很关键,内存的使用就不那么重要了。

-it必须是有序列表(目前正在ArrayList上同步),尽管不是排序列表(即不使用可比或比较器排序,而是根据插入顺序排序)。

-the列表将很大,包含多达100000个域对象,因此使用类似CopyOnWriteArrayList之类的东西是不可行的。

-the编写/更新信息部分通常非常快速,只需简单添加/删除/插入或替换(set)

-the读取操作大部分时间将主要执行elementAt(索引)调用,尽管有些读取操作可能执行二进制搜索或indexOf(元素)

对列表的-no直接迭代已经完成,尽管操作类似于indexOf(.)将遍历列表

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-10-16 09:32:59

你一定要用顺序列表吗?如果映射类型结构更合适,则可以使用ConcurrentHashMap。有了列表,ReadWriteLock可能是最有效的方法。

编辑以反映OP的编辑:插入顺序上的二进制搜索?您是否在二进制搜索中存储时间戳并使用它进行比较?如果是这样的话,您可以使用时间戳作为键,使用ConcurrentSkipListMap作为容器(它维护键顺序)。

票数 3
EN

Stack Overflow用户

发布于 2008-10-16 08:58:14

读取线程在做什么?如果他们正在对列表进行迭代,那么您确实需要确保在整个迭代过程中没有人接触到列表,否则会得到非常奇怪的结果。

如果您能够精确地定义您需要的语义,那么应该有可能解决这个问题--但是您很可能会发现,您需要编写自己的集合类型才能正确有效地完成这个任务。或者,CopyOnWriteArrayList很可能足够好--如果可能昂贵的话。基本上,你越能约束你的需求,它就越有效率。

票数 1
EN

Stack Overflow用户

发布于 2008-10-16 10:05:14

我不知道这是否是解决问题的可行办法,但是.对我来说,使用数据库管理器来保存大量的数据并让它管理事务是有意义的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/207829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档