社区
Java SE
帖子详情
因为Vector是同步的,所以当一个Iterator使用时,被另一线程改变,将抛出异常,为什么呢?
wren4255
2008-04-22 02:10:49
没看懂这句话!
...全文
107
5
打赏
收藏
因为Vector是同步的,所以当一个Iterator使用时,被另一线程改变,将抛出异常,为什么呢?
没看懂这句话!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Johnson_Hong
2008-04-22
打赏
举报
回复
就是一个线程操作一个vector的时候,其它的线程不允许去改变他
anqini
2008-04-22
打赏
举报
回复
[Quote=引用 2 楼 wren4255 的回复:]
同步是什么意思?
[/Quote]
对数据的同步,一个时刻只有一个线程访问此Vector,或者修改!
还有,因为数据的同步,所以你执行遍历Iterator的时候别的线程remove掉Vector某个元素,就出异常了!
还有Vector是老板本的容器,建议你使用新版本的,List,Map,Set,Collections类来保持同步!
joejoe1991
2008-04-22
打赏
举报
回复
没用过vector ,学习。
wren4255
2008-04-22
打赏
举报
回复
同步是什么意思?
finalzhzhk
2008-04-22
打赏
举报
回复
Vector是同步的,
所以当一个线程使用它时,而另一个线程想改变它,就会导致异常了.
(这句话提到的Iterator只是这个Vector的一个引用)
vector
Vector
非常类似ArrayList,但是
Vector
是
同步
的。由
Vector
创建的
Iterator
,虽然和ArrayList创建的
Iterator
是同一接口,但是,因为
Vector
是
同步
的,当
一个
Iterator
被创建而且正在被
使用
,另
一个
线程
改变
了
Vector
的状态(例如,添加或删除了一些元素),这
时
调用
Iterator
的方法
时
将抛出ConcurrentModificationException,因此必须捕获该异常。 Stack 类 Stack继承自
Vector
,实现
一个
后进先出的堆栈。Sta.
什么是
线程
安全
什么是
线程
安全? 如果你的代码所在的进程中有多个
线程
在同
时
运行,而这些
线程
可能会同
时
运行这段代码。如果每次运行结果和单
线程
运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是
线程
安全的。
或者说:
一个
类或者程序所提供的接口对于
线程
来说是原子操作或者多个
线程
之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑
同步
的问题。
线程
安全问题都是由全局变量及静态变量引起的。
若每个
线程
中对全局变量、静态变量只有读操作,而无写操作,一
Iterator
的fail-fast
关于
Iterator
的fail-fast比较完整的解释请参考jdk中在
Vector
,ArrayList等具体实现
时
的相关描述:这里有
一个
比较清楚的翻译:
*
Iterator
是工作在
一个
独立的
线程
中,并且拥有
一个
mutex 锁。
Iterator
被创建之后会建立
一个
指向原来对象的单链索引表,
* 当原来的对象数量发生变化
时
,这个索引表的内容不会
同步
改变
,所以当索引指针往后移动的
时
候就找不到要迭代的对象,所以按照
* fail-fast 原则 It
Vector
并非是绝对的
线程
安全类
众所周知,
Vector
是
一个
线程
安全的类,其在add()等操作上添加了synchronized关键字实现
同步
,但是并非是绝对的
线程
安全类. 当进行迭代遍历
时
,如果在另
一个
线程
执行add(),remove()操作,仍然会有机率
抛出异常
ConcurrentModificationException. Java版本:9.0.1 package com.util; import java.util...
leetcode——
Iterator
使用
思考(仅单
线程
安全remove 方法、多
线程
下对
iterator
遍历加锁)
今天在做剑指 Offer 38. 字符串的排列
时
,视图利用 map 保存字符与字符个数的映射关系,然后取 map 的 key 集合(map.getSet),对 set 进行遍历
时
对value 为0的值直接用 map.remove(c)进行删除,结果爆出了 ConcurrentModificationException。 猜想原因应该是:遍历的对象是利用 getSet 方法获取的 Set 类型引用,这些引用指向的是 map 中的地址,而不是又新建了
一个
Set 对象,因此问题相当于:遍历 Set 引用的
时
.
Java SE
62,623
社区成员
307,257
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章