-
一、区别
-
1. Volatile 仅能使用在变量级别;
synchronized 则可以使用在变量、方法、和类级别的.2. Volatile仅能实现变量的修改可见性,并不能保证原子性(复合操作的原子性);
synchronized则可以保证变量的修改可见性和原子性。3. Volatile不会造成线程的阻塞;
synchronized可能会造成线程的阻塞。4. Volatile标记的变量不会被编译器优化(因为这是由cpu指令完成);
synchronized标记的变量可以被编译器优化(JAVA1.6后性能优化很多)。 -
总之,其中volatile 是比synchronized关键字更加轻量级的同步机制,因为它不需要加锁,也就不会阻塞,所以性能会好点。
-
二、运用
-
比如使用在单例模式的双重检查方式中:
-
public class Singleton{ //懒汉式+双重检查加锁 private volatile static Singleton newInstance = null; private Singleton(){} public static Singleton getInstance(){ if(newInstance == null){ synchronized (Singleton.class){ if(newInstance == null){ newInstance = new Singleton(); } } } return newInstance; } }
volatile和synchronized的区别
最新推荐文章于 2023-07-23 20:07:58 发布