力所能及之java线程安全和非线程安全问题
2015-04-11 18:30
316 查看
ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?StringBuilder和StringBuffer有什么区别?这些都是Java面试中常见的基础问题。面对这样的问题,回答是:ArrayList是非线程安全的,Vector是线程安全的;HashMap是非线程安全的,HashTable是线程安全的;StringBuilder是非线程安全的,StringBuffer是线程安全的。因为这是昨晚刚背的《Java面试题大全》上面写的。此时如果继续问:什么是线程安全?线程安全和非线程安全有什么区别?分别在什么情况下使用?这样一连串的问题,一口老血就喷出来了…
二者如何取舍
非线程安全是指多线程操作同一个对象可能会出现问题。而线程安全则是多线程操作同一个对象不会有问题。
线程安全必须要使用很多synchronized关键字来同步控制,所以必然会导致性能的降低。
所以在使用的时候,如果是多个线程操作同一个对象,那么使用线程安全的Vector;否则,就使用效率更高的ArrayList。
非线程安全!=不安全
有人在使用过程中有一个不正确的观点:我的程序是多线程的,不能使用ArrayList要使用Vector,这样才安全。
非线程安全并不是多线程环境下就不能使用。注意我上面有说到:多线程操作同一个对象。注意是同一个对象。在主线程中new的一个ArrayList然后多个线程操作同一个ArrayList对象。
如果是每个线程中new一个ArrayList,而这个ArrayList只在这一个线程中使用,那么肯定是没问题的。
线程安全的实现
线程安全是通过线程同步控制来实现的,也就是synchronized关键字。
二者如何取舍
非线程安全是指多线程操作同一个对象可能会出现问题。而线程安全则是多线程操作同一个对象不会有问题。
线程安全必须要使用很多synchronized关键字来同步控制,所以必然会导致性能的降低。
所以在使用的时候,如果是多个线程操作同一个对象,那么使用线程安全的Vector;否则,就使用效率更高的ArrayList。
非线程安全!=不安全
有人在使用过程中有一个不正确的观点:我的程序是多线程的,不能使用ArrayList要使用Vector,这样才安全。
非线程安全并不是多线程环境下就不能使用。注意我上面有说到:多线程操作同一个对象。注意是同一个对象。在主线程中new的一个ArrayList然后多个线程操作同一个ArrayList对象。
如果是每个线程中new一个ArrayList,而这个ArrayList只在这一个线程中使用,那么肯定是没问题的。
线程安全的实现
线程安全是通过线程同步控制来实现的,也就是synchronized关键字。
相关文章推荐
- Java线程安全问题及线程安全解决方法
- 黑马程序员——Java多线程之线程安全问题
- 利用JAVA线程安全队列简单实现读者写者问题。
- Java赋值的线程安全问题
- java线程安全问题之静态变量、实例变量、局部变量
- 关于java Servlet,Struts,springMVC 的线程安全问题
- java线程安全问题之静态变量、实例变量、局部变量
- Java中线程的创建使用及其安全问题
- 拿来主义:java中的线程安全与非线程安全,以及如何使用和实现
- java线程安全问题之静态变量、实例变量、局部变量
- java线程编程安全问题
- Java arraylist线程不安全 vectory 线程安全
- java线程安全之死锁问题
- java线程安全问题之静态变量、实例变量、局部变量
- java线程安全问题之静态变量、实例变量、局部变量
- Java并发(一)-- 线程安全(从“线程不安全”说起)
- java线程安全问题之静态变量、实例变量、局部变量
- JAVA中的线程安全与非线程安全
- java 线程六-解决线程安全隐患问题-加锁
- 设计模式——单例模式(Java)——考虑多线程环境下的线程安全问题