首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Vector是线程安全的?

“同学们,大家谁能知道Vector和ArraysList的区别是什么?”

“老师,Vector是线程安全的,而ArraysList不是”。

“很好!”

我们下面来看一段景区卖门票的代码:

这段代码是模拟景区卖票的案例,先在集合中初识化了一堆门票,然后开始卖,卖的同时还有退票的,那么这段代码有没有问题?

可能有的朋友们会直接看出来,ArrayList不是线程不安全的吗,两个线程访问同一个ArrayList肯定会出问题的。

没错,运行程序,出现如下异常:

有同学就会说了,老师,把ArrayList改成Vector就可以了,其实不然,当我们把ArrayList换成Vector之后,错误依旧,那Vector是线程安全的,为什么还会报此错呢?

这是因为他混淆了线程安全和同步修改异常了,ConcurrentModificationException异常是当一个集合被多个线程访问并修改的时候才会可能出现的,这与线程同步是两码事,线程同步是为了保护集合中的数据不被脏读、脏写而设置的,我们来看线程安全到底用在什么地方,代码如下:

.

你看,上面这两个线程在卖同一张门票。这时才是线程不同步的问题,只需要把ArrayList修改为Vector即可解决问题,因为Vector的每个方法前都加上了synchronized关键字,同时只会允许一个线程进入该方法,确保了程序的可靠性。

本文参考自:《编写高质量代码:改善java程序的151个建议》

作者:秦少波

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201113A00UEJ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券