首先提一个问题,Vector是线程安全的吗?
很多人都会回答:vector是线程安全的。
确实,通过查看JDK源码中,Vector确实是线程安全的,至少Vector的作者是这么说的。 通过观察源码,发现 Vector 类中的大部分方法都是由 synchronized 关键字来修饰的,这也就保证了所有的对外接口都会以 Vector 对象为锁。访问 Vector 的任何方法都必须获得对象的 intrinsic lock (或叫 monitor lock ),所以在Vector内部,所有的方法都不会被多线程访问。
但是,单个方法的原子性(注:原子性,程序的原子性即不会被线程调度机制打断),并不能保证复合操作也具有原子性。
详见贴子:https://blog.csdn.net/xdonx/article/details/9465489
所以,Vector 真的是线程安全的吗?正确答案如下: 虽然源代码注释里面说这个是线程安全的,因为确实很多方法都加上了同步关键字 synchronized ,但是对于复合操作而言,只是同步方法并没有解决线程安全的问题。要真正达成线程安全,还需要以 Vector 对象为锁,来进行同步处理。
复合操作: Vector 所谓的线程安全是指调用 Vector 类的成员方法时,其他线程不能再访问该Vector对象。但是在调用两个Vector成员方法时,当前线程有可能再完成第一个方法后时间片到期,这时其他线程可以访问该Vector对象,造成调用第二个成员方法的结果可能与预想结果不同。这时为了保证线程安全,需要加synchronized。
所以,Vector 应该尽早地被废除,因为这样做本身没有解决多线程问题,反而,在引入了概念的混乱的同时,导致性能问题,因为 synchronized 的开销是巨大的:阻止编译器乱序,hint for 处理器寄存一/二级缓存。。。
参考文章:https://www.cnblogs.com/hankzhouAndroid/p/8716279.html