synchronized表示只有一个线程可以获取作用对象的锁,执行代码,阻塞其他线程。 volatile表示变量在CPU的寄存器中是不确定的,必须从主存中读取。保证多线程环境下变 量的可见性;禁止指令重排序。
区别
1、 volatile是变量修饰符;synchronized可以修饰类、方法、变量。
2、 volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证 变量的修改可见性和原子性。
3、 volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
4、 volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。
5、 volatile关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized关 键字要好。
但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。 synchronized关键字在JavaSEl.6之后进行了主要包括为了减少获得锁和释放锁带来的性能 消耗而引入的偏向锁和轻量级锁以及其它各种优化之后执行效率有了显著提升,实际开发中使 用synchronized关键字的场景还是更多一些。

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.