美文网首页
volatile与synchronized区别

volatile与synchronized区别

作者: 董董呀 | 来源:发表于2024-05-08 11:35 被阅读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会引入一定的性能开销,因为它强制每次读取都从主内存获取最新值,并在每次写入后刷新到主内存。高并发场景下影响性能。

相关文章

网友评论

      本文标题:volatile与synchronized区别

      本文链接:https://www.haomeiwen.com/subject/jqwdfjtx.html