社区
Java SE
帖子详情
线程安全集合类也有例外?
hellobbboy
2012-12-11 11:04:51
看了篇大大的文章,说,
线程安全类,如HashTable,Vector和通过Collections.synchronizedList()等方法获得的集合,
这些集合会当被迭代时,如果被其他线程访问,就会抛异常:ConcurrentModificationException。
这是真的假的啊,毁三观啊啊啊啊啊
求真人指点一二。
...全文
183
5
打赏
收藏
线程安全集合类也有例外?
看了篇大大的文章,说, 线程安全类,如HashTable,Vector和通过Collections.synchronizedList()等方法获得的集合, 这些集合会当被迭代时,如果被其他线程访问,就会抛异常:ConcurrentModificationException。 这是真的假的啊,毁三观啊啊啊啊啊 求真人指点一二。
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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中有关
线程安全
的
集合类
的知识,那么只看这一篇就足够了!)
线程安全
的
集合类
的方法,即当发现需要扩容时,创建一个新的数组,同时搬运几个元素过去,后续每次线程操作ConcurrentHashMap时,都会搬运元素,每次操作搬运一部分元素。,当读取顺序表时,此时无
线程安全
问题,而当有线程要修改其中的值时,就会将list复制一份,修改新表中的内容,并修改引用的指向(操作是原子的,无需加锁)因此,针对读取操作,无需加锁,不同链表的操作,也无需加锁,而当针对同一链表操作时,需要加锁,此时,我们可以考虑使用。哈希表中本就需要有数组,数组的元素都是已经存在的(每个链表的头节点),此时,只需。
哪些
集合类
是
线程安全
的?
Java 早期
线程安全
集合(如VectorHashtable)因性能较低,通常不推荐使用。推荐使用 java.util.concurrent包中的
集合类
(如)来替代传统同步集合,性能更优。如果没有现成的
线程安全
实现,可以使用方法对非
线程安全
集合进行包装。
线程安全
集合类
Java 提供了丰富的
线程安全
集合类
,能够满足各种多线程环境下的数据管理需求。Vector和Hashtable是早期的
线程安全
集合类
,但在现代开发中,性能更好的等
集合类
更为常用。在多线程开发中,理解不同
集合类
的
线程安全
特性和性能表现,对于编写高效、安全的代码至关重要。选择合适的
集合类
,不仅可以确保数据一致性,还可以显著提升应用程序的性能。
【JavaEE初阶】
线程安全
的
集合类
原来的
集合类
, 大部分都不是
线程安全
的.Vector, Stack, HashTable, 是
线程安全
的(不建议用), 其他的
集合类
不是
线程安全
的.为什么不建议使用呢?因为我们在使用的时候,这些类就会自动的加锁,虽然编译器会自动优化为没有锁竞争的线程进行锁消除的优化,但是呢万一编译器没有优化好,就麻烦了所以我们更多的是搭配一下其他方案达到
线程安全
,比如以下几种。
Java SE
62,620
社区成员
307,251
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章