美文网首页Java-解读Java并发编程实战-可爱猪猪解读
【连载】第3章-3.2发布与逸出(前后端架构师必须掌握的知识)

【连载】第3章-3.2发布与逸出(前后端架构师必须掌握的知识)

作者: 可爱猪猪 | 来源:发表于2019-08-26 21:22 被阅读0次

格言:在程序猿界混出点名堂!

《JAVA并发编程实战》解读
【连载】第3章-3.2发布与逸出

上一节思考题:用Volatile修饰的变量vi,多线程执行vi++,线程安全吗?
答案是不安全,因为volatile只能保证自身的原子性,保证不了vi++这种复合操作的原子性。

回顾:上一节聊了非原子的64位,比如long和double,然后使用volatile关键字可以保证变量的原子性,该关键字是一种稍弱的同步机制,这一节讲的是发布与逃逸。

发布与逸出

发布:使对象能够在当前作用域外的代码使用。
逃逸:当一个不该发布的对象被发布出去的时候。
什么意思呢?比如某系统的CacheService,本来缓存系统的参数列表PARAMS仅供其他方法只读访问,但是其他类获取后可以修改Param对象的内容,让缓存PARAMS失去控制。
有的时候我们也会听到方法逃逸这个关键词,也就是说方法内的局部变量从方法内逃逸出去。

@NotSafe
public class CacheService{
        private static Map<String,Param> PARAMS = new HashMap<>();
        static{
              initParams();
        }
       public Map<String,Param> getParams(){
          return PARAMS;
       }
}

发布的方式

  • 公有的静态变量
    比如
 public static Map<String,Param> PARAMS = new HashMap<>();
  • 通过方法传递给作用域外
    比如私有或者局部通过方法返回以发布出去。
  • 间接发布对象
    比如CacheService中的Param对象就被间接发布出去了。
  • 发布内部的类实例
public class ThisEscape{
  public ThisEscape(EventSource source){
     source.registerListener(new EventListener(){

       public void onEvent(Event e){
          doSomething();
      }
    });
  }
}

当ThisEscape发布EventListener时,也隐含地发布了ThisEscape实例本身,因为在这个内部类的实例中包含了对ThisEscape实例的隐含引用。
试想,如果在构造函数还未初始化好的时候,事件对this对象进行了修改。让this对象出现了不可控的状态。

后面章节会解说如何安全发布,可关注微信公众号,查看下期连载。

喜欢连载可关注简书或者微信公众号
简书专题:Java并发编程实战-可爱猪猪解读
https://www.jianshu.com/c/ac717321a386
微信公众号:可爱猪猪聊程序

相关文章

网友评论

    本文标题:【连载】第3章-3.2发布与逸出(前后端架构师必须掌握的知识)

    本文链接:https://www.haomeiwen.com/subject/cwxjectx.html