线程安全问题(Java)

本文小编从网上载入,原文地址http://www.cnblogs.com/chy2055/p/5175969.html

1:ArrayList是非线程安全的,Vector是线程安全的;HashMap是非线程安全的,HashTable是线程安全的;StringBuilder是非线程安全的,StringBuffer是线程安全的。

2:线程安全:

当多个线程类并发操作某类的某个方法,(在该方法内部)来修改这个类的某个成员变量的值,不会出错,则我们就说,该的这个方法是线程安全的。

某类的某方法是否线程安全的关键是:

(1) 该方法是否修改该类的成员变量;

(2) 是否给该方法加锁(是否用synchronized关键字修饰)。

3:线程不安全:

当多个线程类并发操作某类的某个方法,(在该方法内部)来修改这个类的某个成员变量的值,很容易就会发生错误,故我们就说,这个方法是线程不安全的。如果要把这个方法变成线程安全的,则用synchronized关键字来修饰该方法即可。

注:用synchronized关键字修饰方法,会导致加锁,虽然可以使该方法线程安全,但是会极大的降低该方法的执行效率,故要慎用该关键字。

用 ArrayList还是Vector,二者如何取舍?

线程安全:指多线程操作同一个对象的某方法,修改该类的成员变量时,不会出现错误。

非线程安全:指多线程操作同一个对象的某方法,修改该类的成员变量时,可能会出现错误。

线程安全必须要使用很多synchronized关键字来同步控制,所以必然会导致性能的降低。

所以在使用的时候,如果是多个线程操作同一个对象,那么使用线程安全的Vector;否则,就使用效率更高的ArrayList。

非线程安全!=不安全

有人在使用过程中有一个不正确的观点:我的程序是多线程的,不能使用ArrayList要使用Vector,这样才安全。

非线程安全并不是多线程环境下就不能使用。注意上面有说到:多线程操作同一个对象。注意是同一个对象

比如最上面那个模拟,就是在主线程中new的一个ArrayList然后多个线程操作同一个ArrayList对象,就会有安全问题。

如果是每个线程中new一个ArrayList,而这个ArrayList只在这一个线程中使用,那么肯定是没安全问题的。

总结:

若多个线程同时修改某个外部传来的对象的成员变量,很容易就会出现错误,我们称之为线程不安全。(该类的这个方法是线程不安全的。若要线程安全,用synchronized关键字修饰即可)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,632评论 18 399
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 11,952评论 0 62
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 7,645评论 0 11
  • 前两天被杨舒惠同学安利了这部电影,当时激动之下就想看了,奈何很少有电影院放映,排片太少了。可能主角的号召力和IP影...
    我是王嘉译阅读 1,837评论 0 1
  • 甲状腺是位于人体颈部甲状软骨下方,气管两旁,形状似蝴蝶,犹如盾甲, 所以称之为甲状腺。甲状腺分为左右两叶和峡部。左...
    蝴蝶精灵阅读 4,808评论 0 4

友情链接更多精彩内容