代码
public class SingleObject { private static SingleObject instance; private static object lockobj = new object(); private SingleObject() { } public static SingleObject GetInstance() { if (instance==null) { lock (lockobj) { if (instance==null) { instance = new SingleObject(); } } } return instance; } }
为什么这里要双重检查 1、lock外部的if作用:锁很贵,如果在这里加了的话,后面的线程就会首先加一把锁,导致线程阻塞在这里,会降低程序的运行效率,先进行if判断,如果这个字段已经被实例化就不加锁 2、lock内部if的作用:如果没有lock里面的这个if,在lock外部之后的if,加锁,假设三个线程 A,B,C 线程A 首先拿到锁,线程B和线程C被阻塞在lock外,如果线程A执行完之后,线程B或线程C会拿到锁并会重新创建对象,这就违背了单例模式的初衷标签:加锁,SingleObject,lock,private,instance,线程,单例,设计模式 From: https://www.cnblogs.com/liuzongxian/p/16866547.html