加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在Java 6中使用的最佳方法,可以同时访问List

发布时间:2020-12-15 03:01:37 所属栏目:Java 来源:网络整理
导读:我有一个由多个线程访问的List对象.主要有一个线程,在某些情况下有两个线程,用于更新列表.根据正在处理的用户请求数,有一到五个可以从此列表中读取的线程. 该列表不是要执行的任务队列,它是正在检索和同时更新的域对象的列表. 现在有几种方法可以访问此列表
我有一个由多个线程访问的List对象.主要有一个线程,在某些情况下有两个线程,用于更新列表.根据正在处理的用户请求数,有一到五个可以从此列表中读取的线程.
该列表不是要执行的任务队列,它是正在检索和同时更新的域对象的列表.

现在有几种方法可以访问此列表的线程安全:
– 使用同步块
– 使用普通锁(即读写操作共享相同的锁)
– 使用ReadWriteLock
– 使用一个新的ConcurrentBLABLBA集合类

我的问题:
什么是最佳使用方法,因为cricital部分通常不包含大量操作(主要是添加/删除/插入或从列表中获取元素)?
你能推荐另一种方法,上面未列出吗?

有些限制
– 最佳性能至关重要,内存使用不是那么多
-it必须是有序列表(当前在ArrayList上同步),尽管不是排序列表(即不使用Comparable或Comparator排序,但根据插入顺序排序)
– 列表很大,包含多达100000个域对象,因此使用像CopyOnWriteArrayList这样的东西是不可行的
– 写入/更新电路部分通常非常快,做简单的添加/删除/插入或替换(设置??)
– 大多数时候,读取操作主要执行elementAt(索引)调用,尽管某些读取操作可能会进行二分查找,或者indexOf(元素)
– 不会对列表进行直接迭代,但像indexOf(..)这样的操作将遍历列表

解决方法

你必须使用顺序列表吗?如果map-type结构更合适,则可以使用ConcurrentHashMap.使用列表,ReadWriteLock可能是最有效的方法.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读