发布对象与对象溢出
1)发布对象:使一个对象能够被当前范围之外的代码所使用;
2)对象逸出:一种错误的发布。当一个对象还没有构造完成时,就使它被其他线程所见;
安全发布对象
1)在静态初始化函数中初始化一个对象引用;
单例模式,懒汉模式(常规情况下线程不安全,加synchronized关键字修饰方法后变得线程安全,但是不推荐使用,同一时间只能一个线程访问该方法,性能开销大;可以使用双重检测机制加同步锁,即双重同步锁单例模式,但是此类因为CPU和JVM优化发生指令重排的情况下,也并不是线程安全的,此时可以用valatile限制指令重排),恶汉模式(线程安全,可能会造成性能资源的浪费)
2)将对象的引用保存到volatile类型域或者AtomicReference对象中;
3)将对象的引用保存到某个正确构造对象的final类型域中;
4)将对象的引用保存到一个由锁保护的域中;
使用枚举的方式,线程最安全,推荐使用
public class SingletonEnum {
// 私有构造函数
private SingletonEnum () {}
public static SingletonEnum getInstance() {
return Singleton.INSTANCE.getInstance();
}
private enum Singleton {
INSTANCE;
private SingletonEnum singleton;
// JVM保证个方法绝对只调用一次
Singleton() {
singleton = new SingletonEnum();
}
public SingletonEnum getInstance() {return singleton;}
}
}