学习JVM——结合单例模式学习指令重排及类加载

本文介绍了指令重排的概念,包括编译器和CPU层面的重排,以单例模式为例说明其在多线程环境中的影响。同时,文章探讨了Java类的加载机制,重点在类的初始化阶段,解释了如何通过类加载避免多线程下的单例问题。通过对静态资源在准备阶段的初始化,可以确保线程安全。
摘要由CSDN通过智能技术生成

一、指令重排

指令重排是指在程序执行过程中, 为了性能考虑, 编译器和CPU可能会对指令重新排序.

1.编译器重排

int a = 1;
int b = 2;

在这种没有依赖顺序的语句是有可能会变成先给b赋值再给a赋值

2.cpu重排

汇编的一条指令实际上是会分解成多步并交由不同的硬件来进行操作

然后各个硬件相当于流水线的工人,可能这个硬件效率高,执行了4条指令,而另外一个执行了3条,就会导致原本看起来是一个汇编指令的指令有了不同的先后顺序。

那么结合单例模式的创建,举个doublecheck的例子

package singleton.lazy;

public class DoubleCheckLockingSingleton {
   
    private static DoubleCheckLockingSingleton uniqueInstance;

    private DoubleCheckLockingSingleton() {
    }

    public static DoubleCheckLockingSingleton getInstance() {
        if (uniqueInstance == null) {
            synchronized (DoubleCheckLockingSingleton.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new DoubleCheckLockingSingleton();
                }
            }
        }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值