社区
Java SE
帖子详情
线程安全集合类也有例外?
hellobbboy
2012-12-11 11:04:51
看了篇大大的文章,说,
线程安全类,如HashTable,Vector和通过Collections.synchronizedList()等方法获得的集合,
这些集合会当被迭代时,如果被其他线程访问,就会抛异常:ConcurrentModificationException。
这是真的假的啊,毁三观啊啊啊啊啊
求真人指点一二。
...全文
118
5
打赏
收藏
线程安全集合类也有例外?
看了篇大大的文章,说, 线程安全类,如HashTable,Vector和通过Collections.synchronizedList()等方法获得的集合, 这些集合会当被迭代时,如果被其他线程访问,就会抛异常:ConcurrentModificationException。 这是真的假的啊,毁三观啊啊啊啊啊 求真人指点一二。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
龙四
2012-12-11
打赏
举报
回复
HashTable,Vector和通过Collections.synchronizedList()等方法获得的集合对象本身是线程安全的,但没人跟你说其对应的Iterator也是线程安全的啊,已经是两个对象了
hellobbboy
2012-12-11
打赏
举报
回复
觉得楼上大哥说的好,看看还有高见某,让帖子再飞一会儿。。。
pywepe
2012-12-11
打赏
举报
回复
doc说的线程安全很多都指的是相对线程安全 不可变类才是绝对线程安全的 看下面的例子: Vector vector = new Vector(); thread 1: for(int i = 0 ; i < 1000 ; i ++){ vector.add("a"); Thread.sleep(1000); } thread 2: for(Object obj in vector){ ... } thread 1每次add,vector内部都在发生变化(写) 而thread 2都是在没有加锁的情况下遍历(读取)vector的 所以抛出 ConcurrentModificationException 并发修改异常 想要避免这个异常的话,就必须避免并发修改,即: Object lk = new Object(); thread 1: lock(lk){ for(int i = 0 ; i < 1000 ; i ++){ vector.add("a"); Thread.sleep(1000); } } thread 2: lock(lk){ for(Object obj in vector){ ... } }
hellobbboy
2012-12-11
打赏
举报
回复
有道理啊,这么理解容易多了。 这个线程安全还真是很坑爹的赶脚。。。
java超强笔记
java超强笔记。涵盖java详细信息,适合初学者阅读,从安装到软件设计,涉及全面,阅读方便。
Java多线程(八)——
线程安全
的
集合类
如果多个线程同时修改
集合类
中的元素,那么很容易破坏这种结构。比如,一个线程可能在插入元素,它刚刚找到了自己要插入的桶的位置,刚修改了一部分,结果另外一个线程正在查找一个值,然后这个线程要么会读取不到数据,要么就会形成环,而一直循环。 你可以使用锁保护数据,但是你可以使用
线程安全
的实现。我们之前讨论的阻塞队列就是
线程安全
的。在下面,我们讨论一些Java支持的其他
线程安全
的
集合类
。 高效的映射,集合和队列 java.util.concurrent包里面实现了高效的映射、集合和队列的实现:ConcurrentHa
多线程(4)
线程安全
的集合
目录 一、
线程安全
的集合 二、高效的映射、集合和队列 1、ConcurrentHashMap 2、ConcurrentSkipListMap 三、写数组的拷贝 四、旧的
线程安全
的集合 一、
线程安全
的集合 如果多线程要并发地修改一个数据结构,例如散列表,那么很容易会破坏这个数据结构。例如,一个线程可能要开始向表中插入一个新元素。假定在调整散列表各个桶之间的链接关系的过程中,被剥夺了控...
什么是
线程安全
?
线程安全
“
线程安全
”的定义: 当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象时
线程安全
的。 该定义要求
线程安全
的代码都必须具备一个共同特征: 代码本身封装了所有必要的正确性保障手段(如互斥同步等),令调用者无须关心多线程下的调用问题,更无须自己实现任何措施来保证多线程环境下的正确调用。 java语言中的
线程安全
线程安全
,将以多个线程之间存在共享数据访问
Java的多线程之
线程安全
的集合
一、
线程安全
的集合 如果多线程要并发地修改一个数据结构,例如散列表,那么很容易会破坏这个数据结构。例如,一个线程可能要向表中插入一个新元素。加入在调整散列表各个桶之间的链接关系的过程中,被剥夺了控制权。如果另一个线程也开始遍历同一个链表,可能使无效的链接并造成混乱,会抛出异常或陷入死循环。 可以通过提供锁来保护共享数据结构,但是选择
线程安全
的实现作为替代可能更容易
Java SE
62,634
社区成员
307,269
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章