新能源 东莞网站建设,Oss怎么做静态网站,佛山企业网站设计制作,广东省建设执业资格注册中心网站双重检验锁#xff1a;设计模式中的单例模式#xff0c;细分为单例模式中的懒加载模式。
单例模式
单例模式#xff1a;指的是一个类只有一个对象。最简单的实现方式是设一个枚举类#xff0c;只有一个对象。缺点是当对象还没有被使用时#xff0c;对象就已经创建存在了…双重检验锁设计模式中的单例模式细分为单例模式中的懒加载模式。
单例模式
单例模式指的是一个类只有一个对象。最简单的实现方式是设一个枚举类只有一个对象。缺点是当对象还没有被使用时对象就已经创建存在了对内存的消耗大。
懒汉式和饿汉式
懒汉式是指使用时才产生对象。
饿汉式不管用没用到一开始就创建好对象。
双重检验锁的代码实现来自菜鸟教程 **代码解析**
1.构造方法设为private(私有的)目的是防止外部new对象。因为单例模式只能有一个对象。否则就不是单例模式了。
2.在类里创建一个private的对象防止外部直接访问对象。
3.每个线程都是通过getSingleton()方法来获取对象相当于一个访问器。它是静态的因为非静态方法要通过对象来调用而我们不允许外部创建对象。又因为这个方法是static的所以上面创建的对象也要static的因为静态的方法只能访问类里静态的对象。
4.两个if(singletonnull)的作用)假设有x个线程同时访问getSingleton()方法想要获取对象其中有5个执行到了第一个if(singleton null){}开始竞争锁第一个竞争成功的向下执行最后得到对象第二个if(singleton null){}是拦截第一个线程外的其他4个线程因为第一个线程竞争成功后singleton就不为null了第一个if就穿透了需要后面的第二个if来拦截这四个线程进入阻塞队列。如果后面又来了几个线程访问getSingleton()方法会直接被第一个if(singleton null){}拦截。
5.volatile的作用是在new完Sigleton()对象后立即告诉其他线程singleton不为null了。防止已经通过第一个if判断的线程继续去竞争锁。
6.锁不能加在getSingleton()方法上而是加在代码块上因为会影响效率很多线程想要调用该方法让其在判断完if(singletonnull)后再加锁效率浪费的时间更少。