首页 » 软件优化 » 带你理解Java的单例模式(线程华为执行模式对象)

带你理解Java的单例模式(线程华为执行模式对象)

南宫静远 2024-11-26 01:28:11 0

扫一扫用手机浏览

文章目录 [+]

1.memory = allocate() 分配对象的内存空间

2.ctorInstance() 初始化对象

3.instance = memory 设置instance指向刚分配的内存

带你理解Java的单例模式(线程华为执行模式对象) 软件优化
(图片来自网络侵删)

单纯执行以上三步没啥问题,但是在多线程情况下,可能会发生指令重排序。

指令重排序对单线程没有影响,单线程下CPU可以按照顺序执行以上三个步骤,但是在多线程下,如果发生了指令重排序,则会打乱上面的三个步骤。

如果发生了JVM和CPU优化,发生重排序时,可能会按照下面的顺序执行:

1.memory = allocate() 分配对象的内存空间

3.instance = memory 设置instance指向刚分配的内存

2.ctorInstance() 初始化对象

假设目前有两个线程A和B同时执行getInstance()方法,A线程执行到instance = new SingletonExample4(); B线程刚执行到第一个 if (instance == null){处,如果按照1.3.2的顺序,假设线程A执行到3.instance = memory 设置instance指向刚分配的内存,此时,线程B判断instance已经有值,就会直接return instance;而实际上,线程A还未执行2.ctorInstance() 初始化对象,也就是说线程B拿到的instance对象还未进行初始化,这个未初始化的instance对象一旦被线程B使用,就会出现问题。

代码五:SingletonExample5

package io.binghe.concurrency.example.singleton;/ @author binghe @version 1.0.0 @description

package io.binghe.concurrency.example.singleton;/ @author binghe @version 1.0.0 @description 饿汉模式,单例实例在类装载的时候进行创建,是线程安全的/public class SingletonExample6 {private SingletonExample6(){}private static SingletonExample6 instance = null;static {instance = new SingletonExample6();}public static SingletonExample6 getInstance(){return instance;}}代码七:SingletonExample7

枚举方式进行实例化,是线程安全的,此种方式也是线程最安全的

package io.binghe.concurrency.example.singleton;/ @author binghe @version 1.0.0 @description 枚举方式进行实例化,是线程安全的,此种方式也是线程最安全的/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;}}}

关注#华为云开发者联盟# 点击下方,第一时间了解华为云新鲜技术~

华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云

相关文章