单例模式
-
饿汉模式:类加载到内存中就实例化一个单例,JVM保证线程安全
- 构造方法设为私有,在类定义的时候实例化
public class Mgr01 { private static final Mgr01 INSTANCE = new Mgr01(); private Mgr01() { } public static Mgr01 getInstance() { return INSTANCE; } public void m() { //其他业务方法 } public static void main(String[] args) { Mgr01 mgr01 = Mgr01.getInstance(); Mgr01 mgr02 = Mgr01.getInstance(); System.out.println(mgr01==mgr02); } }
- 缺点:不管装载与否,类装载时就完成实例化
-
懒汉模式:什么时候使用什么时候初始化
public class Mgr02 { private static Mgr02 INSTANCE ; private Mgr02() { } public static Mgr02 getInstance() { if(INSTANCE==null) { /*try { Thread.sleep(1); }catch(Exception e) { e.printStackTrace(); }*/ INSTANCE= new Mgr02(); } return INSTANCE; } public void m() { //其他业务方法 } public static void main(String[] args) { for(int i =0;i<100;i++) { new Thread(()->{ System.out.println(Mgr02.getInstance().hashCode()); }).start() ; } } }
- 缺点:容易造成线程问题(通过synchronized锁来解决,但是造成效率低下)
-
对懒汉模式的改进(加synchronized)
public class Mgr05 { private static Mgr05 INSTANCE; private Mgr05() { } public static Mgr05 getInstance() { if (INSTANCE == null) { synchronized (Mgr05.class) { if (INSTANCE == null) { try { Thread.sleep(1); } catch (Exception e) { e.printStackTrace(); } INSTANCE = new Mgr05(); } } } return INSTANCE; } public void m() { // 其他业务方法 } public static void main(String[] args) { for (int i = 0; i < 100; i++) { new Thread(() -> { System.out.println(Mgr05.getInstance().hashCode()); }).start(); } } }
-
静态内部类实现懒加载
//静态内部类实现懒加载 public class Mgr03 { private Mgr03() { } private static class Mgr03Holer { private final static Mgr03 INSTANCE = new Mgr03(); } public static Mgr03 getInstance() { return Mgr03Holer.INSTANCE; } public void m() { //其他业务方法 } public static void main(String[] args) { for (int i = 0; i < 100; i++) { new Thread(() -> { System.out.println(Mgr02.getInstance().hashCode()); }).start(); } } }
-
枚举单列
public enum Mgr04 { INSTANCE; public void m() { //其他业务方法 } public static void main(String[] args) { for (int i = 0; i < 100; i++) { new Thread(() -> { System.out.println(Mgr04.INSTANCE.hashCode()); }).start(); } } }