在Java中,
ArrayList是非线程安全的,Vector是线程安全的;
HashMap是非线程安全的,HashTable是线程安全的;
StringBuilder是非线程安全的,StringBuffer是线程安全的。
非线程安全是指多线程操作同一个对象时,可能会出现某些异常问题;而线程安全时多个线程操作同一个对象不会出现问题。
非线程安全执行效率更高,因为线程安全必须要使用很多 synchronized 关键字来同步控制,所以必然会导致性能的降低。
例如:
ArrayList和Vector,在主线程中new一个非线程安全的ArrayList,然后开10个线程分别向这个ArrayList中添加元素,每个线程添加100个元素,等所有线程执行完成后,这个ArrayList的大小一定是1000个元素吗?
多次测试结果如下:
945
1000
1000
998
959
可见,有些情况下,最终ArrayList大小并不是1000,有些是正确的1000个(因为非线程安全并不是每次都会导致问题),有时候还会抛出异常。
所以ArrayList是非线程安全的,但是当我们在主线程中new的是Vector对象,则后面的测试结果全部是正确的,即Vector是线程安全的,HashTable和StringBuffer同理。
另外,非线程安全 =!不安全,只要在多线程情况下,不操作同一个对象,使用非线程安全是不会出现问题的。