应用场景
只需要一个对象,如:配置文件、工具类、线程池、缓存对象、日志对象等
饿汉模式
public class SingleTon { /**1.私有化构造函数,使类不被外部实例化*/ private SingleTon() { } /**2.私有化实例对象*/ private static SingleTon instance = new SingleTon(); /**外部获取对象方法*/ public static SingleTon getInstance() { return instance; } }
public class TestSingleTon { public static void main(String[] args) { SingleTon s1 = SingleTon.getInstance(); SingleTon s2 = SingleTon.getInstance(); System.out.println(s1 == s2); } }
懒汉模式-线程不安全
public class SingleTon { /**1.私有化构造函数,使类不被外部实例化*/ private SingleTon() { } /**2.私有化实例对象*/ private static SingleTon instance = null; /**外部获取对象方法*/ public static SingleTon getInstance() { if (instance == null) { instance = new SingleTon(); } return instance; } }
懒汉模式-线程安全
public class SingleTon { /**1.私有化构造函数,使类不被外部实例化*/ private SingleTon() { } /**2.私有化实例对象*/ private static SingleTon instance = null; /**外部获取对象方法*/ public static SingleTon getInstance() { /**当instance不为null时,线程不用等待,直接绕过锁*/ if (instance == null) { /**线程同步*/ synchronized(SingleTon.class) { if (instance == null) { instance = new SingleTon(); } } } return instance; } }
饿汉模式与懒汉模式的区别
饿汉模式的特点是加载类时比较慢,但运行时获取对象的速度比较快
懒汉模式的特点是加载类时比较快,但运行时获取对象的速度比较慢