java多线程访问集合类

鑫鑫哥哥呀 2014-03-06 07:05:40
java多线程访问一个集合,如何使线程的元素仅能被访问一次;
...全文
149 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
鑫鑫哥哥呀 2014-03-06
  • 打赏
  • 举报
回复
indexHolder 是自增吗
鑫鑫哥哥呀 2014-03-06
  • 打赏
  • 举报
回复

while (true) {
  int index = indexHolder.getAndIncrement();
  if (index >= list.size())
    break;
  Object element = list.get(index);
  // ...
  //index++;???
}
是不是还要index++啊
raistlic 2014-03-06
  • 打赏
  • 举报
回复
引用 5 楼 Romantic_lyx 的回复:
我遍历的是set集合,set集合好像没有类似get方法获得集合元素吧
遍历之前 List list = Collections.concurrentList(new ArrayList(set));
鑫鑫哥哥呀 2014-03-06
  • 打赏
  • 举报
回复
我还有一个疑问:多线程处理其中每个元素,是不是说其中元素仅能被某一个线程访问一次?
gaofuqi 2014-03-06
  • 打赏
  • 举报
回复
可以考虑一下,以下两种思路: 1.使用两个集合,所有的元素开始都在一个集合里,当集合的元素被访问后,将该元素移动到另一个集合; 2.集合的元素加个访问标识属性,已经访问过的元素的访问标识属性设置为true,当访问一个元素时,都要先对元素的访问标识属性进行判断,访问标识属性为true时返回null,访问标识属性为true时返回元素对象。 以上两种思路都要注意同步问题。
鑫鑫哥哥呀 2014-03-06
  • 打赏
  • 举报
回复
我遍历的是set集合,set集合好像没有类似get方法获得集合元素吧
raistlic 2014-03-06
  • 打赏
  • 举报
回复
比如遍历一个只读的 List list,多线程处理其中每个元素, 可以用 AtomicInteger 储存 index final AtomicInteger indexHolder = new AtomicInteger(0); 每个线程内:

while (true) {
  int index = indexHolder.getAndIncrement();
  if (index >= list.size())
    break;
  Object element = list.get(index);
  // ...
}
list 需要满足条件: 1 - 安全发布 2 - 遍历期间没有任何线程对其写操作
鑫鑫哥哥呀 2014-03-06
  • 打赏
  • 举报
回复
集合的元素仅能被访问一次,不管是被哪个线程访问。比如有一个集合有上万个元素,用多线程怎么遍历
gaofuqi 2014-03-06
  • 打赏
  • 举报
回复
是只能访问一次还是只能被一个线程访问?只能访问一次的意义是什么?
鑫鑫哥哥呀 2014-03-06
  • 打赏
  • 举报
回复
是集合的元素仅能被访问一次,不管是被哪个线程访问。。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧