单例模式 发表于 2020-07-18 | 分类于 Concurrent Programming 本篇文章将介绍:饿汉模式、懒汉模式、静态内置类模式、静态代码模式 不积跬步,无以至千里。不积小流,无以成江海。 饿汉模式 12345678910 package test; public class MyObject { // 立即加载方式==饿汉模式 private static MyObject myObject = new MyObject(); private MyObject() { } public static MyObject getInstance() { return myObject; } } 懒汉模式 1234567891011121314151617181920212223 package test; public class MyObject { private volatile static MyObject myObject; private MyObject() { } public static MyObject getInstance() { try { if (myObject != null) { } else { // 模拟在创建对象之前做一些准备性的工作 Thread.sleep(3000); synchronized (MyObject.class) { if (myObject == null) { myObject = new MyObject(); } } } } catch (InterruptedException e) { e.printStackTrace(); } return myObject; } } 静态内置类模式 1234567891011 package test; public class MyObject { private static class MyObjectHandler { private static MyObject myObject = new MyObject(); } private MyObject() { } public static MyObject getInstance() { return MyObjectHandler.myObject; } } 静态内置类可以达到线程安全问题,但如果遇到序列化对象时,使用默认的方式运行得到的结果还是多例的。 解决方案: 123456789101112131415 package test; public class MyObject { private static class MyObjectHandler { private static MyObject myObject = new MyObject(); } private MyObject() { } public static MyObject getInstance() { return MyObjectHandler.myObject; } protected Object readResolve() throws ObjectStreamException { System.out.println("调用了readResolve方法!"); return MyObjectHandler.myObject; } } 静态代码模式 123456789101112 package test; public class MyObject { private static MyObject instance = null; private MyObject() { } static { instance = new MyObject(); } public static MyObject getInstance() { return instance; } }