- 饿汉模式
package test.design.singleton; /** * 单例模式(饿汉模式) * 使用场景:当类只有一个实例,且可以从一个固定的点访问时,保证实例只有一个 * 优点:在类加载时就完成了初始化,线程安全 * Created by Z on 2017/4/17. */ public class EagerSingleton { //静态变量 private static EagerSingleton eagerSingleton = new EagerSingleton(); /** * 私有构造函数 * 不允许被外部所创建 保证只有一个实例 */ private EagerSingleton() { System.out.println("GetInstance"); } public static EagerSingleton getInstance() { return eagerSingleton; } public void print() { System.out.println("This is EagerSington"); } } class Test { public static void main(String[] args) { EagerSingleton.getInstance().print(); System.out.println(EagerSingleton.getInstance()); // 这样就会报错 因为构造函数是私有的不允许被外部创建 // EagerSingleton es =new EagerSingleton(); } }
输出:
GetInstance
This is EagerSington
test.design.singleton.EagerSingleton@4a574795
- 懒汉模式
package test.design.singleton; /** * 单例模式(懒汉模式) * 使用场景同饿汉模式 * 优点:在使用时加载,节省内存 * Created by Z on 2017/4/17. */ public class LasySingleton { private static LasySingleton lasySingleton = null; private LasySingleton() { System.out.println("GetInstance"); } /** * 线程同步 * 不加synchronized线程是不安全的 * @return */ public static synchronized LasySingleton getInstance() { if (lasySingleton == null) { lasySingleton = new LasySingleton(); } return lasySingleton; } public void print() { System.out.println("This is LasySingleton"); } } class TestLasySingleton { public static void main(String[] args) { LasySingleton.getInstance().print(); System.out.println(LasySingleton.getInstance()); // 这样就会报错 因为构造函数是私有的不允许被外部创建 // LasySingleton ls =new LasySingleton(); } }
输出:
GetInstance
This is LasySingleton
test.design.singleton.LasySingleton@4a574795
//和上一个分配的内存地址是一样的...
- 总结
饿汉模式:空间换时间;懒汉模式:时间换空间。一般用饿汉模式就可以了。