前言
Volatile在单列模式中的作用,学习笔记。参考抖音渡一老师对Volatile的解析(摘自抖音:《渡一Java学习频道》,该文章为学习笔记涉及侵权请告知删稿)
一、Volatile的作用?
- 对象可视化即在多线程当中被volatile修饰的属性可以被多个线程感知。类似于线程A修改某个被volatile修饰的属性,这个修改的值会通知其他访问该属性的线程。其他属性对于这个值也会随着线程A的更改同步更改。
- 解决指令重排
二、Volatile在单列模式的运用
1.单列模式代码
代码如下(示例):
下面的代码是大多数人都会写的懒汉单列模式,改代码有可能导致single这个属性创建多次即便加了锁和双重判断。因为在创建single对象的时候,底层的虚拟机在执行构造方法和加载内部空间信息这两个步骤来回切换,有可能先执行构造方法再去加载内部空间,也有可能先加载内部空间信息在去执行构造方法。这种情况下,这个single对象被两个线程拿到但是执行的顺序不一致从而创建两个对象(即为指令重排)
public class Single {
private Single(){}
private static Single single;
public static Single getSingle(){
synchronized (single.getClass()){
if(single==null){
single = new Single();
}
}
return single;
}
}
2.解决办法
代码如下(示例):
在sing对象属性前加入volatile关键字
public class Single {
private Single(){}
private static volatile Single single;
public static Single getSingle(){
synchronized (single.getClass()){
if(single==null){
single = new Single();
}
}
return single;
}
}