“同学们,大家谁能知道Vector和ArraysList的区别是什么?”
“老师,Vector是线程安全的,而ArraysList不是”。
“很好!”
我们下面来看一段景区卖门票的代码:
这段代码是模拟景区卖票的案例,先在集合中初识化了一堆门票,然后开始卖,卖的同时还有退票的,那么这段代码有没有问题?
可能有的朋友们会直接看出来,ArrayList不是线程不安全的吗,两个线程访问同一个ArrayList肯定会出问题的。
没错,运行程序,出现如下异常:
有同学就会说了,老师,把ArrayList改成Vector就可以了,其实不然,当我们把ArrayList换成Vector之后,错误依旧,那Vector是线程安全的,为什么还会报此错呢?
这是因为他混淆了线程安全和同步修改异常了,ConcurrentModificationException异常是当一个集合被多个线程访问并修改的时候才会可能出现的,这与线程同步是两码事,线程同步是为了保护集合中的数据不被脏读、脏写而设置的,我们来看线程安全到底用在什么地方,代码如下:
.
你看,上面这两个线程在卖同一张门票。这时才是线程不同步的问题,只需要把ArrayList修改为Vector即可解决问题,因为Vector的每个方法前都加上了synchronized关键字,同时只会允许一个线程进入该方法,确保了程序的可靠性。
本文参考自:《编写高质量代码:改善java程序的151个建议》
作者:秦少波
领取专属 10元无门槛券
私享最新 技术干货