synchronized、指令重排序、有序性

news/2024/10/22 15:32:01/

问题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.ppmy.cn/news/561983.html

相关文章

php合成图片系统,php图片合成

// 新建一个新的 GD 图像流并输出图像 //header("Content-type: image/png"); function combine_image($image1, $image2, $opt 100) { $wimage_data GetImageSize($image1); $width_im1 $wimage_data[0]; $height_im1 $wimage_data[1]; switch ($wimage_data[2]…

php 图片处理库 Imagick 代替 gd

一般用php处理图片都是使用GD库或者GD2的函数库,一般编译php环境都会搭上GD库,大多数开源程序也是用GD来处理图片的,但是它只能现实诸如调整大小、增加水印等基础功能,要想用GD来做复杂图形是非常困难的。 还好有个基于命令行的图…

英特尔固态硬盘测试软件,SSD固态硬盘检测测试软件(Intel SSD Toolbox)

Intel SSD Toolbox是一个功能非常不错的SSD固态硬盘检测测试软件,除了一般的检测项目外,它还拥有三项特色的检测项目。 Intel SSD Toolbox特色功能: “05:Re-allocated Sector Count”:重映射扇区数量。闪存本身有一定…

窥探贪心算法:从贪婪到最优,解密最佳选择之道

贪心算法:从贪心到最优 贪心算法是一种简单而强大的算法思想,常用于解决最优化问题。它的核心思想是在每一步选择中,都采取当前情况下最优的选择,而不考虑全局的最优解。贪心算法在很多实际问题中都有广泛的应用。例如&#xff0…

Ubuntu 20.04 LTS 查看 CPU 温度

cat /sys/class/thermal/thermal_zone0/tempor cat /sys/devices/virtual/thermal/thermal_zone0/temp每隔1秒自动检测一次cpu温度 watch -n 1 cat /sys/devices/virtual/thermal/thermal_zone0/temp

CPU温度原理

通过传感器感知温度然后向接收设备输出对应的电信号 然后接收设备通过这个电信号就能得知CPU的温度是多少了。 这个传感器现在都集成在了CPU内部,仅占很小的一点 通过CPU的一个针脚传递给主板的芯片,然后系统是可以 直接读取到主板芯片内的数据的&#x…

c++ 代码获取CPU温度

import psutildef get_cpu_temperature():temperature psutil.sensors_temperatures()[cpu-thermal][0].currentreturn temperatureprint(get_cpu_temperature())

树莓派监测CPU温度

通过raspberrypi os下的“/sys/class/thermal/thermal_zone0/temp”文件获取CPU温度,并用bc命令转换为更直观的浮点数温度显示,并通过watch命令实时监控。执行watch命令时,终端进入全屏,使用“Ctrl C”键即可退出全屏。 watch…