zoukankan      html  css  js  c++  java
  • java并发编程笔记(四)——安全发布对象

    java并发编程笔记(四)——安全发布对象

    发布对象

    使一个对象能够被当前范围之外的代码所使用

    对象逸出

    一种错误的发布。当一个对象还没构造完成时,就使它被其他线程所见

    不安全的发布对象

    某一个类的构造方法为公共的。

    如:

    public class UnsafePublish {
    
        private String[] states = {"a", "b", "c"};
    
        public String[] getStates() {
            return states;
        }
    
        public static void main(String[] args) {
            UnsafePublish unsafePublish = new UnsafePublish();  //这行代码,发布了一个实例
            log.info("{}", Arrays.toString(unsafePublish.getStates()));
    
            unsafePublish.getStates()[0] = "d";
            log.info("{}", Arrays.toString(unsafePublish.getStates()));
        }
    }
    

    对象逸出的案例:

    public class Escape {
    
        private int thisCanBeEscape = 0;
    
        public Escape () {
            new InnerClass();
        }
    
        private class InnerClass {
    
            public InnerClass() {
                log.info("{}", Escape.this.thisCanBeEscape); 
            }
        }
    
        public static void main(String[] args) {
            new Escape();
        }
    }
    

    安全的发布对象

    • 在静态初始化函数中初始化一个对象运用
    • 将对象的引用保存到volatile类型域或者AtomicReference对象中
    • 将对象的引用保存到某个正确的构造对象的final类型域中
    • 将对象的引用保存到一个由锁保护的域中

    volatile使用场景

    • 修饰装填码,保证操作原子性
    • 双重检测机制中,防止指令重排序
  • 相关阅读:
    复利计算4.0单元测试(c语言)
    操作系统之“实验一”
    操作系统cmd算法
    <构建之法>之第一二三章的感悟
    assertion的语法和语义
    java对象的内存分配
    Oracle Berkeley DB Java 版
    acid数据库事务正确执行的四个基本要素的缩写编辑本义项
    volatile-java关键字
    Heritrix源码分析(十五)
  • 原文地址:https://www.cnblogs.com/xujie09/p/11694158.html
Copyright © 2011-2022 走看看