volatile与synchronized区别
2024-05-08 本文已影响0人
董董呀
相同特性
同步。
volatile与synchronized的读写都会强制刷新主内存。将业务内存数据删除,刷新主内存,同步业务缓存。
不同特性
volatile保证多线程可见,但不保证原子性
synchronized可以保证原子性
volatile的应用场景
状态标记、简单的数据共享。
例如,单例模式的双重检查。
public class Singleton{
private volatile static Singleton singleton;
private Singleton(){};
public static Singleton getInstance(){
if(null == singleton){
synchronized (Singleton.class){
if(null == singleton){
singleton = new Singleton();
}
}
}
return singleton;
}
}
在多线程场景下,只要有一个线程创建成功,对其他线程可见。
volatile的使用注意事项
- 可见性而非原子性
- 适合简单的状态标记
- 避免过度使用。
由于volatile读写具有较高的成本,应谨慎使用,只在确实需要共享且不需要同步块提供的互斥控制时才使用它 - 不适用于循环依赖条件
因为每个volatile变量的更新仅保证在其自身的语义上是有序的,而不是全局有序 - 不影响其他非volatile变量的可见性
- 性能影响
使用volatile会引入一定的性能开销,因为它强制每次读取都从主内存获取最新值,并在每次写入后刷新到主内存。高并发场景下影响性能。