标签:没有 void print pac 失败 asi read highlight vol
先来个单例模式的线程安全代码
package basic.single; public class SingleTon { private SingleTon(){ System.out.println(Thread.currentThread().getName()); } private static volatile SingleTon singleTon; /*public static SingleTon getInstance(){ if(singleTon == null){ synchronized (SingleTon.class){ if(singleTon == null){ singleTon = new SingleTon(); } } } return singleTon; }*/ public static synchronized SingleTon getInstance(){ if(singleTon == null){ singleTon = new SingleTon(); } return singleTon; } public static void main(String[] args) { for (int i = 0; i < 10; i++) { new Thread(()->{ SingleTon.getInstance(); }).start(); } } }
我们可以看到,加在方法上面一次就行了,因为虚拟机在执行方法的时候会加锁。
但是使用注释的代码那边,这种叫多线程双重校验,这里由于方法上没有关键字,导致多个线程同时锁住SingleTon.class,导致单例失败。所以我们在使用这种代码块锁的时候要额外注意。
注意:volatile 这个关键字的使用是个加分项。
标签:没有 void print pac 失败 asi read highlight vol
原文地址:https://www.cnblogs.com/johnzhao/p/14654208.html