多线程-- 三.安全发布对象和单例模式举例

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

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

安全发布对象4种方法:

1.在静态初始化函数中初始化一个对象引用.

2.将对象的引用保存到volatile类型域或者AtomicReference对象中.

3.将对象的引用保存到某个正确构造对象的final类型域中.

4.将对象的引用保存到一个有锁保护的域中.


单例模式

1.懒汉模式

单例实例在第一次使用时进行创建

这种写法在单线程环境下没问题的,但是在多线程环境下会出现问题.线程不安全

原因是如果有多条线程同时访问的话,可能会被调用两次,那么两条线程拿到的实例是不一样的

懒汉模式改造为线程安全

①.只要把工厂方法加上synchronized修饰就可以,这样就保证这个方法在同一时间内只能被一条线程所执行,即保证了线程安全.但是并不推荐,因为也带来了性能问题.

②.用双重检测机制+volatile,改造为线程安全

2.饿汉模式

单例实例在类装载的时候进行创建,可以保证线程的安全

但是,如果构造方法中存在过多的处理,会导致类加载的时候特别慢,可能引起效率问题.

3.枚举模式(最安全的)

最推荐的这种模式

   

猜你喜欢

转载自blog.csdn.net/zhmystic/article/details/82117557
今日推荐