关于Vector到底是不是 线程安全的 问题

线程安全,在java的多并发编程中是重要概念,意思是,多个线程同时操作一个对象,在各种不同情况下,都不会造成不同的后果。

一个经典问题,Vector到底是不是线程安全的?

 

很多人都会回答是,vector是线程安全的。

诚然,不止是很多IT教材上是这么写的,就连JDK的作者写的注释也是这么说的。如下图(图为 JDK中Vector的源代码):注释中,红框标记的部分写着:如果你不需要线程安全的实现类,那就推荐你用ArrayList,而不是Vector。言外之意,就是说,Vector是线程安全的。

自己看了源码,发现,确实很多方法都有同步关键字synchronized,从而保证所有的对外接口都会以 Vector对象为锁,即,在vector内部,所有的方法都不会被多线程访问。

但是,单个方法的原子性(注:原子性,程序的原子性即不会被线程调度机制打断),并不能保证复合操作也具有原子性。

(你问 为什么复合操作不能保证原子性? 参见大神的帖子:https://blog.csdn.net/xdonx/article/details/9465489 ,我没太多时间研究细节,所以就只好剽窃大佬的结论了╮( ̄▽ ̄")╭)

所以,这个问题的正确回答应该是:

虽然源代码注释里面说这个是线程安全的,因为确实很多方法都加上了同步关键字synchronized,但是对于符合操作而言,只是同步方法并没有解决线程安全的问题。

要真正达成线程安全,还需要以vector对象为锁,来进行操作。

所以,如果是这样的话,那么用vector和ArrayList就没有区别了,所以,不推荐使用vector。

 

所以说,就算是JDK,也会有坑,毕竟坑坑更健康,有坑才能引导我们思考,毕竟做程序是理科工作,要有怀疑精神。

其实,具体为什么复合操作不具有原子性,我也没有太深究,可能要从Vector代码里面找根据,有空再探究。

 

转载于:https://www.cnblogs.com/hankzhouAndroid/p/8716279.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vector是一个线程安全的类,它的方法都是同步的,并且明确设计为在多线程环境中工作。然而,它的线程安全性是有限制的。在某些方法之间存在状态依赖,如果在迭代过程中Vector被其他线程修改,通过Vector.iterator()返回的迭代器会抛出ConcurrentModificationException异常。因此,虽然Vector的方法都加上了同步关键字synchronized,但对于复合操作而言,只是同步方法并没有解决线程安全问题。要真正实现线程安全,需要以Vector对象为锁来进行同步处理。这样才能保证在调用Vector的成员方法时,其他线程不能再访问该Vector对象,避免出现预期之外的结果。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [Vector线程安全](https://blog.csdn.net/xuxin132133/article/details/88068120)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Vector线程安全问题](https://blog.csdn.net/A12115419/article/details/121145752)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值