耘朵
一只不务正业的程序媛
Toggle navigation
耘朵
主页
归档
标签
安全发布对象
java
线程
2021-10-12 17:18:03
195
0
0
admin
java
线程
## 发布对象 发布对象:使一个对象能被当前范围之外的代码所使用 对象逸出:一种错误的发布。当一个对象还没有构造完成时,就使它被其他线程所见 ## 安全发布对象 **四种方法** 1. 在静态初始化函数中初始化一个对象引用 2. 将对象的引用保存到volatile类型域或者AtomicReference对象中 3. 将对象的引用保存到某个正确构造对象的final类型域中 4. 将对象的引用保存到一个由锁保护的域中 ## 单例模式举例 ### 懒汉模式 ``` package com.csyd.concurrency.example.singleton; import com.csyd.concurrency.annoations.NotRecommend; import com.csyd.concurrency.annoations.NotThreadSafe; import com.csyd.concurrency.annoations.ThreadSafe; /** * 懒汉模式 -》 双重同步锁单例模式 * 单例实例在第一次使用时进行创建 */ @ThreadSafe public class SingletonExample5 { //私有的构造函数 private SingletonExample5(){ } //单例对象 volatile+双重检测机制 -> 禁止指令重排,不加volatile指令重排会线程不安全 private volatile static SingletonExample5 instance = null; //静态的工厂方法 public static SingletonExample5 getInstance(){ if (instance == null){ //双重检测机制 synchronized (SingletonExample5.class) { // 同步锁 if (instance == null) { instance = new SingletonExample5(); } } } return instance; } } ``` ### 饿汉模式 ``` package com.csyd.concurrency.example.singleton; import com.csyd.concurrency.annoations.ThreadSafe; /** * 饿汉模式 * 单例实例在类装载时进行创建 */ @ThreadSafe public class SingletonExample6 { //私有的构造函数 private SingletonExample6(){ } //单例对象 private static SingletonExample6 instance = null; static { instance = new SingletonExample6(); } //静态的工厂方法 public static SingletonExample6 getInstance(){ return instance; } public static void main(String[] args) { System.out.println(getInstance()); System.out.println(getInstance()); } } ``` ### 枚举模式(最推荐的方式) ``` package com.csyd.concurrency.example.singleton; import com.csyd.concurrency.annoations.Recommend; import com.csyd.concurrency.annoations.ThreadSafe; /** * 枚举模式 */ @ThreadSafe @Recommend public class SingletonExample7 { private SingletonExample7(){ } public static SingletonExample7 getInstance(){ return Singleton.INSTANCE.getInstance(); } private enum Singleton{ INSTANCE; private SingletonExample7 singleton; // JVM保证这个方法绝对只调用一次 Singleton(){ singleton = new SingletonExample7(); } public SingletonExample7 getInstance(){ return singleton; } } } ```
上一篇:
JUC中AQS-AbstractQueuedSynchronizer并发中的同步器
下一篇:
线程安全
0
赞
195 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
文档导航