线程安全分析-黑马深入学习Java并发编程笔记

后端 潘老师 3周前 (03-31) 8 ℃ (0) 扫码查看



安全分析

成员变量和静态变量:

  • 如果它们没有共享,则线程安全
  • 如果它们被共享了,根据它们的状态是否能够改变,分两种情况:
    • 如果只有读操作,则线程安全
    • 如果有读写操作,则这段代码是临界区,需要考虑线程安全问题

局部变量:

  • 局部变量是线程安全的
  • 局部变量引用的对象不一定线程安全(逃逸分析):
    • 如果该对象没有逃离方法的作用访问,它是线程安全的(每一个方法有一个栈帧)
    • 如果该对象逃离方法的作用范围,需要考虑线程安全问题(暴露引用)

常见线程安全类:String、Integer、StringBuffer、Random、Vector、Hashtable、java.util.concurrent 包

  • 线程安全的是指,多个线程调用它们同一个实例的某个方法时,是线程安全的
  • 每个方法是原子的,但多个方法的组合不是原子的,只能保证调用的方法内部安全:
    Hashtable table = new Hashtable();
    // 线程1,线程2
    if(table.get("key") == null) {
        table.put("key", value);
    }
    

无状态类线程安全,就是没有成员变量的类
不可变类线程安全:String、Integer 等都是不可变类,内部的状态不可以改变,所以方法是线程安全

  • replace 等方法底层是新建一个对象,复制过去
    Map<String,Object> map = new HashMap<>();    // 线程不安全
    String S1 = "...";                            // 线程安全
    final String S2 = "...";                    // 线程安全
    Date D1 = new Date();                        // 线程不安全
    final Date D2 = new Date();                    // 线程不安全,final让D2引用的对象不能变,但对象的内容可以变
    

抽象方法如果有参数,被重写后行为不确定可能造成线程不安全,被称之为外星方法:public abstract foo(Student s);


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/16597.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】