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