首页 > 代码库 > 所谓线程安全和非线程安全
所谓线程安全和非线程安全
ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?StringBuilder和StringBuffer有什么区别?这些都是Java面试中常见的基础问题。面对这样的问题,回答是:ArrayList是非线程安全的,Vector是线程安全的;HashMap是非线程安全的,HashTable是线程安全的;StringBuilder是非线程安全的,StringBuffer是线程安全的。这些是面试时经常问道的问题,但是有些情况下面试的人会追问:什么是线程安全,什么是非线程不安全?使用时机?
举例来说:在一个main方法中创建一千个线程为同一个list添加元素,每个线程添加100个元素,正常情况来说在程序执行完毕的时候list的长度应该为10W。假如List的实现类是 ArrayList(非线程安全的),那么在程序执行完毕之后List的长度是不固定的!可能为10W,但是也有可能不是10W,也有可能会发生 ArrayIndexOutOfBoundsException异常。但是假如List的实现类是Vector就不会产生这种情况,其结果一定是10W条,这就是二者的区别;
释义:
也就是说非线程安全指的是当多个线程操作同一个对象的时候可能会出现问题,而线程安全则不会有问题;
但是线程安全要使用到synchronized来控制线程的同步,因而线程安全相应的性能相对低下;
当不是多个线程访问同一个对象的时候使用非线程安全的实现类是没有问题的。
使用时机来说,只要是不是多个线程访问同一个对象的情况二者都可以使用
所谓线程安全和非线程安全