我有一个List对象被多个线程访问。大多数情况下只有一个线程,在某些情况下,有两个线程更新列表。根据正在处理的用户请求的数量,可以从此列表读取一到五个线程。该列表不是要执行的任务队列,而是正在同时检索和更新的域对象的列表。
现在有几种方法可以使对这个列表线程的访问安全:
-use同步块
-use普通锁(即读写操作系统共享相同的锁)
-use ReadWriteLock
-use是新的ConcurrentBLABLBA集合类之一
我的问题:
考虑到环状部分通常不包含很多操作(主要是添加/删除/插入或从列表中获取元素),那么使用的最佳方法是什么?
你能推荐另一种方法吗,上面没有列出?
若干约束
-optimal的性能很关键,内存的使用就不那么重要了。
-it必须是有序列表(目前正在ArrayList上同步),尽管不是排序列表(即不使用可比或比较器排序,而是根据插入顺序排序)。
-the列表将很大,包含多达100000个域对象,因此使用类似CopyOnWriteArrayList之类的东西是不可行的。
-the编写/更新信息部分通常非常快速,只需简单添加/删除/插入或替换(set)
-the读取操作大部分时间将主要执行elementAt(索引)调用,尽管有些读取操作可能执行二进制搜索或indexOf(元素)
对列表的-no直接迭代已经完成,尽管操作类似于indexOf(.)将遍历列表
发布于 2008-10-16 09:32:59
你一定要用顺序列表吗?如果映射类型结构更合适,则可以使用ConcurrentHashMap。有了列表,ReadWriteLock可能是最有效的方法。
编辑以反映OP的编辑:插入顺序上的二进制搜索?您是否在二进制搜索中存储时间戳并使用它进行比较?如果是这样的话,您可以使用时间戳作为键,使用ConcurrentSkipListMap作为容器(它维护键顺序)。
发布于 2008-10-16 08:58:14
读取线程在做什么?如果他们正在对列表进行迭代,那么您确实需要确保在整个迭代过程中没有人接触到列表,否则会得到非常奇怪的结果。
如果您能够精确地定义您需要的语义,那么应该有可能解决这个问题--但是您很可能会发现,您需要编写自己的集合类型才能正确有效地完成这个任务。或者,CopyOnWriteArrayList很可能足够好--如果可能昂贵的话。基本上,你越能约束你的需求,它就越有效率。
发布于 2008-10-16 10:05:14
我不知道这是否是解决问题的可行办法,但是.对我来说,使用数据库管理器来保存大量的数据并让它管理事务是有意义的
https://stackoverflow.com/questions/207829
复制相似问题