
非线程安全是指多线程操作同一个对象可能会出现问题。而线程安全则是多线程操作同一个对象不会有问题。
线程安全必须要使用很多synchronized关键字来同步控制,所以必然会导致性能的降低。
所以在使用的时候,如果是多个线程操作同一个对象,那么使用线程安全的Vector;否则,就使用效率更高的ArrayList。
非线程安全!=不安全
有人在使用过程中有一个不正确的观点:我的程序是多线程的,不能使用ArrayList要使用Vector,这样才安全。
非线程安全并不是多线程环境下就不能使用。注意我上面有说到:多线程操作同一个对象。注意是同一个对象。比如最上面那个模拟,就是在主线程中new的一个ArrayList然后多个线程操作同一个ArrayList对象。
如果是每个线程中new一个ArrayList,而这个ArrayList只在这一个线程中使用,那么肯定是没问题的。
补充阅读#
解释 Java 集合线程安全讨论中,共享对象与单线程对象的区别。
如何理解与使用#
关键是多个线程是否访问同一个可变对象,而不只是程序是否使用多线程。线程私有的集合与共享集合需要不同的并发设计。
验证与边界#
线程安全不只靠 synchronized,也不能认为换成 Vector 就自动保证“先检查再修改”等复合操作原子性。围绕实际共享状态设计并发测试。
