一、懒汉式——DCL写法
优点:解决线程、效率高
package com.atguigu.single02; /* 单例模式类:保证对象唯一性 懒汉式:线程安全问题 DCL写法(双重检查)(面试终极写法) * */ public class Single { //本类的成员位置,创建自己的对象 private static Single single = null; private Single(){} /* 为了提供程序执行效率,同步代码块(不要同步方法) 线程操作的共享数据 * */ public static Single getInstance(){ if ( single == null){ synchronized(Single.class){ if (single == null) single = new Single(); } } return single; } }
测试代码:
@Test public void testSingle02(){ /*Single single1 = Single.getInstance(); System.out.println("single = " + single1); Single single2 = Single.getInstance(); System.out.println("single = " + single2);*/ for (int i = 0; i < 10; i++) { new Thread(() -> { Single single1 = Single.getInstance(); System.out.println("single = " + single1); }).start(); } }
二、饿汉式
优点:线程安全
缺点:效率低
package com.atguigu.single01; /* 单例模式类:保证对象唯一性 饿汉式 1. 私有修饰构造方法 2. 本类的成员位置,创建自己的对象 自己new自己 3. 提供公共的方法,返回对象 * */ public class Single { private static Single single = new Single(); private Single(){} /* 类文件 Single.class被加载器加入到内存中 内存的那个位置:栈,堆,方法区,寄存器,本地方法栈 Java的好多功能,JDK没有,调用操作系统实现:本地方法,进入本地方法栈运行 class:方法区(JDK8-元数据区):初始化自己的静态成员 * */ public static Single getInstance(){ return single; } }
测试代码:
@Test public void testSingle01(){ Single single1 = Single.getInstance(); System.out.println("single = " + single1); Single single2 = Single.getInstance(); System.out.println("single = " + single2); }