synchronized、指令重排序、有序性

问题1,为什么synchronized未禁止指令重排序,却可以保证有序性
因为加锁之后,同一时间只有一个线程执行,相当于单线程。指令重排序的特点是可以保证串行语义一致,虽然不保证多线程间的语义也一致 。简单来说,指令重排序+单线程运行,可以保证有序性

问题2,双重校验实现单例模式,已经用到了synchronized锁,既然synchronized原子性、可见性、有序性都能保证,为什么还要用volatile?

public class Singleton {
	private volatile static Singleton uniqueInstance;
	private Singleton() {
	}
	public static Singleton getUniqueInstance() {
		//先判断对象是否已经实例过,没有实例化过才进⼊加锁代码
		if (uniqueInstance == null) {  //(1)
			//类对象加锁
			synchronized (Singleton.class) {
				if (uniqueInstance == null) {
					uniqueInstance = new Singleton();
				}
			}
		}
		return uniqueInstance;
	}
}

原因1,(1)处在synchronized代码块外,需要用volatile保证可见性;

原因2,uniqueInstance = new Singleton(); 这段代码其实是分为三步执⾏:

  1. 为 uniqueInstance 分配内存空间
  2. 初始化 uniqueInstance
  3. 将 uniqueInstance 指向分配的内存地址

但是由于 JVM 具有指令重排的特性,执⾏顺序有可能变成 1->3->2。指令重排在单线程环境下不会出现问题,但是在多线程环境下会导致⼀个线程获得还没有初始化的实例。例如,线程 T1 执⾏了 1和 3,此时 T2 调⽤ getUniqueInstance () 后发现 uniqueInstance 不为空,因此返回uniqueInstance ,但此时 uniqueInstance 还未被初始化。

参考资料:
JavaGuide面试突击版
synchronized能不能保证有序性??


http://www.niftyadmin.cn/n/464667.html

相关文章

tensorflow2 tf.train.Checkpoint :变量的保存与恢复

Checkpoint 只保存模型的参数,不保存模型的计算过程,因此一般用于在具有模型源代码的时候恢复之前训练好的模型参数。如果需要导出模型(无需源代码也能运行模型),可以使用SavedModel。 tf.train.Checkpoint :变量的保…

红黑树-迭代器实现

目录 迭代器自增 当前结点存在右子树 当前结点没有存在右子树 迭代器自增完整代码 迭代器自减 迭代器自减代码: 迭代器自增 红黑树的迭代器应该怎么实现呢?现在我模仿大佬的实现逻辑。 我们迭代器最重要是可以允许自增与自减的实现的。 会发现我们…

Unity shader - 纹理采样

目录 1.什么是UV 2.凹凸纹理 3.渐变纹理映射 4.遮罩纹理 1.什么是UV 对于三维模型,有两个最重要的坐标系统,一是顶点的位置(X,Y,Z)坐标,另一个就是UV坐标。什么是UV?简单的…

chatgpt赋能python:Python第几行是什么?了解Python中的行号

Python第几行是什么?了解Python中的行号 如果你是一名Python工程师,你肯定曾经遇到过错误提示中提到的Python第几行。那么Python中的行号是什么?本文将为您解答关于Python中行号的一些基本问题。 什么是Python中的行号? 在Pyth…

使用Abaqus, Fortran, MATLAB和Python实现基于纤维的超弹性模型: 深入了解局部坐标基础的应用

引言 欢迎各位读者,我非常荣幸有这个机会来和你们分享关于在Abaqus中使用局部坐标基础的基于纤维的超弹性模型的教程。在这篇文章中,我将会详细解析如何在Abaqus中使用Fortran, MATLAB和Python来实现一个基于纤维的超弹性模型。希望这篇文章能够帮助你们…

strapi系列--如何建表并在原有官方自动生成的api基础上扩展接口,定制化自己的业务逻辑

为什么要进行后端定制呢? 在实际开发过程中,项目中有些需求需要我们定制化自己的业务逻辑,那么我们该如何处理这个需求呢?本文以图文并茂的形式,基于原有官方自动生成的api,定制一个我们自己的业务逻辑接口…

读故事学BEC英语单词(三)

故事 After achieving remarkable success in his initial business endeavor, Alex was driven by a strong ambition to explore fresh prospects. He made the strategic decision to diversify his enterprise and venture into new markets. With an unwavering entrepre…

读故事学BEC英语单词(一)

故事 In a bustling city, there lived a determined young entrepreneur named Emily. She had always been passionate about creating innovative solutions to everyday problems. One day, she came up with an ingenious idea for a new app that would revolutionize t…