单例模式类似计划生育,其保证类仅有一个实例,且对外提供访问该实例的接口。 所有类都有构造器,若不显示定义,则系统提供默认的构造器;若显示定义,则默认的构造器失效。 使用常规代码实现单例会导致代码臃肿,后期debug和修改时工作量加大。
public class Singleton { PRivate static Singleton obj; //obj设为static private Singleton() { //构造器设为private } public static Singleton getInstance() { //给外部提供一个单例接口 if (obj == null) obj = new Singleton(); return obj; }}实用类:仅仅只是静态方法和静态属性的集合,没有实例对象,如Math类。 为保证单例模式在多线程下的安全性,有两种解决方案,饿汉式和懒汉式(形象的比喻)。
饿汉式(线程安全,代码简洁,空间效率低):
public class Singleton { private static Singleton obj = new Singleton(); //obj设为static private Singleton() { //构造器设为private } public static Singleton getInstance() { //给外部提供一个单例接口 return obj; }}懒汉式(延迟实例对象创建时间,只有在需要时才创建):线程等待时有一定的时间开销。
直接对接口加锁:效率低,保证线程安全。
public class Singleton { private static Singleton obj; //obj设为static private Singleton() { //构造器设为private } public synchronized static Singleton getInstance() { //给外部提供一个单例接口 if (obj == null) obj = new Singleton(); return obj; }}双重锁定:效率高,保证线程安全
public class Singleton { private static Singleton obj; //obj设为static private static Object lock = new Object(); //创建一个对象,该对象作为锁使用 private Singleton() { //构造器设为private } public static Singleton getInstance() { //给外部提供一个单例接口 if (obj == null) { //只有对象还未创建时,才进行加锁,否则直接返回对象,无需加锁 synchronized (lock) { if (obj == null) obj = new Singleton(); } } return obj; }}新闻热点
疑难解答