volatile关键字
意义: 解决了私有堆栈和公共堆栈的值不同步问题。强制性从公共堆栈中取值。
1.保证数据的可见性,不保证原子性(原子性:要么一起成功,要么一起失败);synchronized会保证原子性,并且会将私有内存和公共内存做同步所以也支持可见性
2.是线程同步的轻量级实现
3.只能修饰变量
4.volatile不会发生阻塞,synchronized会发生阻塞
5.只能保证从主内存加载到线程里的时候是最新的
----为了达到原子性,可以使用原子类,例如:AcomicInteger
但是原子类每个操作都是原子性的,但是具有原子性的操作之间是不保证原子性的。
当然了最后的结果是正确的,但是无法保证每个线程的原子性。
线程安全包括两方面:可见性、原子性
volatile的应用场景:要能说上来一个
使用前提条件:
对变量的写操作不依赖于当前值
该变量没有包含在具有其他变量的不变式中
状态标志 通常只有一种状态转换;标志从false 转换为true
一次性安全发布 ,就是单例模式
独立观察, 说白了就是只有一个观察者可以去修改一个值,其他线程只能获取
意义: 解决了私有堆栈和公共堆栈的值不同步问题。强制性从公共堆栈中取值。
1.保证数据的可见性,不保证原子性(原子性:要么一起成功,要么一起失败);synchronized会保证原子性,并且会将私有内存和公共内存做同步所以也支持可见性
2.是线程同步的轻量级实现
3.只能修饰变量
4.volatile不会发生阻塞,synchronized会发生阻塞
5.只能保证从主内存加载到线程里的时候是最新的
----为了达到原子性,可以使用原子类,例如:AcomicInteger
但是原子类每个操作都是原子性的,但是具有原子性的操作之间是不保证原子性的。
当然了最后的结果是正确的,但是无法保证每个线程的原子性。
线程安全包括两方面:可见性、原子性
volatile的应用场景:要能说上来一个
使用前提条件:
对变量的写操作不依赖于当前值
该变量没有包含在具有其他变量的不变式中
状态标志 通常只有一种状态转换;标志从false 转换为true
一次性安全发布 ,就是单例模式
//注意volatile!!!!!!!!!!!!!!!!!
private volatile static Singleton instace;
public static Singleton getInstance(){
//第一次null检查
if(instance == null){
synchronized(Singleton.class) { //1
//第二次null检查
if(instance == null){ //2
instance = new Singleton();//3
}
}
}
return instance;
}
独立观察, 说白了就是只有一个观察者可以去修改一个值,其他线程只能获取
开销较低的“读-写锁”策略,就是写的时候用锁,读的时候用volatile
volatile 内存语义:
第一:保证被volatile修饰的变量会保证对所有的线程的可见性,这里的“ 可见性 ”是指当一条线程修改了这个变量的值,新值对于其他变量是可以立即i得知的。
第二:使用volatile变量的语意是禁止指令重排序优化,普通的变量仅仅会保证该方法的执行过程中所有依赖赋值结果的地方都能获取到正确的结果,而不能保证变量赋值操作顺序与程序代码中的执行顺序一致。