简介

volatile 关键字 除了防止 JVM 的指令重排 ,还有一个重要的作用就是保证变量的可见性。
主要用于解决变量在多个线程之间的可见性

JMM内存模型

image.png

DCL单例

  1. /**
  2. * DCL单例(Double Check Lock双端检索机制)
  3. * 多线程下用这种
  4. */
  5. public class SingletonTest5 {
  6. public static volatile SingletonTest5 instance = null;
  7. public static SingletonTest5 getInstance(){
  8. if(instance == null){
  9. sychronized(SingletonTest5.class){
  10. if(instance == null){
  11. instance = new SingletonTest5();
  12. }
  13. }
  14. }
  15. return instance;
  16. }
  17. private SingletonTest5(){
  18. }
  19. }

synchronized 关键字和 volatile 关键字的区别

synchronized 关键字和 volatile 关键字是两个互补的存在,而不是对立的存在!

  • volatile 关键字是线程同步的轻量级实现,所以 volatile 性能肯定比synchronized关键字要好 。但是 volatile 关键字只能用于变量而 synchronized 关键字可以修饰方法以及代码块
  • volatile 关键字能保证数据的可见性,但不能保证数据的原子性。synchronized 关键字两者都能保证。
  • volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized 关键字解决的是多个线程之间访问资源的同步性。