java中volatile和synchronized的区别

概述

java中volatile和synchronized关键字都是伴随着多线程经常使用的关键字,很多然搞不清楚二者的区别,这篇文章记录下来笔者的一点认识,若有不正确的地方欢迎大家在评论区指出。

区别

  • volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
  • volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别
  • volatile仅能实现变量的修改可见性,不能保证原子性 ;而synchronized则可以保证变量的修改可见性和原子性
  • volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
  • volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化

加粗字体部分的原因如下:
线程A修改了变量还没结束时,另外的线程B可以看到已修改的值,而且可以修改这个变量,而不用等待A释放锁,因为Volatile 变量没上锁。

举例

用在多线程,同步变量。
线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来避免这种情况的。volatile告诉jvm,它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A)

总结

synchronized关键字很好理解,就是保证所修饰的变量、方法、和类同时只能被一个xx调用(这里没想好修饰词),而volatile是为了保证变量可以同时被多个线程调用,而且没有上锁,即上面提到的线程A修改了变量还没结束时,另外的线程B可以看到已修改的值,这种机制有利有弊,希望大家使用的时候一定要慎重。

如果觉得有帮助就请我喝杯咖啡鼓励我继续创作吧^_^