音乐网站数据库怎么做,关于百度网站的优缺点,哪个网站可以做推手,wordpress后台增加图片广告位先看双重校验锁的写法
public class Singleton {/*volatile 修饰#xff0c;singleton new Singleton() 可以拆解为3步#xff1a;1、分配对象内存(给singleton分配内存)2、调用构造器方法#xff0c;执行初始化#xff08;调用 Singleton 的构造函数来初始化成员变量singleton new Singleton() 可以拆解为3步1、分配对象内存(给singleton分配内存)2、调用构造器方法执行初始化调用 Singleton 的构造函数来初始化成员变量。3、将对象引用赋值给变量(执行完这步 singleton 就为非 null 了)。若发生重排序假设 A 线程执行了 1 和 3 还没有执行 2B 线程来到判断 NULLB 线程就会直接返回还没初始化的 instance 了。volatile 可以避免重排序。*/private volatile static Singleton singleton;private Singleton() {}public static Singleton getSingleton() {if (singleton null) {synchronized (Singleton.class) {if (singleton null) {singleton new Singleton();}}}return singleton;}}为什么要进行两次非空校验?
第一个 if 判断是为了减少性能开销不用走 synchronized 代码避免多余的加锁操作以及锁的等待和竞争
第二个 if 判断是为了避免生成多个对象实例。比如在未创建实例的情况下A线程和B线程都通过了第一次校验这时如果通过竞争B线程拿到了锁就会执行一次 new 操作生成一个实例然后 B 执行完了 A 就会拿到资源的锁如果没有第二次判断的话这时A线程也会执行一次 new 操作这里就出现了第二个类实例违背了单例原则。