发布对象: 使一个对象能够被当前范围之外的代码所使用
对象逸出: 一种错误的发布.当一个对象还没有构造完成时,就使它被其它线程所见.
安全发布对象4种方法:
1.在静态初始化函数中初始化一个对象引用.
2.将对象的引用保存到volatile类型域或者AtomicReference对象中.
3.将对象的引用保存到某个正确构造对象的final类型域中.
4.将对象的引用保存到一个有锁保护的域中.
单例模式
1.懒汉模式
单例实例在第一次使用时进行创建
这种写法在单线程环境下没问题的,但是在多线程环境下会出现问题.线程不安全
原因是如果有多条线程同时访问的话,可能会被调用两次,那么两条线程拿到的实例是不一样的
懒汉模式改造为线程安全
①.只要把工厂方法加上synchronized修饰就可以,这样就保证这个方法在同一时间内只能被一条线程所执行,即保证了线程安全.但是并不推荐,因为也带来了性能问题.
②.用双重检测机制+volatile,改造为线程安全
2.饿汉模式
单例实例在类装载的时候进行创建,可以保证线程的安全
但是,如果构造方法中存在过多的处理,会导致类加载的时候特别慢,可能引起效率问题.
3.枚举模式(最安全的)
最推荐的这种模式