volatile与Synchronized的异同

原文链接:https://blog.csdn.net/weixin_50586285/article/details/113819652

volatile特点:
关键字volatile是Java虚拟机提供的最轻量级的同步机制 。 当一个变量被定义成volatile之后,具备两种特性:

保证此变量对所有线程的可见性。当一条线程修改了这个变量的值,新值对于其他线程是可以立即得知的。而普通变量做不到这一点。
禁止指令重排序优化。普通变量仅仅能保证在该方法执行过程中,得到正确结果,但是不保证程序代码的执行顺序。用volatile修饰后的变量,赋值后多执行了一个lock addl指令的操作,作用相当于一个内存屏障,使得指令重排序时不能把后面的指令重排序到内存屏障之前,从而阻止了指令重排序。
基于volatile变量的运算在并发下不一定是安全的。volatile变量在各个线程的工作内存,不存在一致性问题(各个线程的工作内存中volatile变量,每次使用前都要刷新到主内存)。但是Java里面的运算并非原子操作,导致volatile变量的运算在并发下一样是不安全的。

volatile对比Synchronized的异同:
Synchronized既能保证可见性,又能保证原子性,而volatile只能保证可见性,无法保证原子性。
volatile关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized关键字要好。但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。synchronized关键字在JavaSE1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其它各种优化之后执行效率有了显著提升,实际开发中使用 synchronized关键字的场景还是更多一些。
多线程访问volatile关键字不会发生阻塞,而synchronized关键字可能会发生阻塞。
volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized关键字解决的是多个线程之间访问资源的同步性。

posted @ 2022-10-25 22:09  锦此  阅读(49)  评论(0编辑  收藏  举报