单例模式,即java类不对外提供构造方法,在类加载的时候创建一个实例化的对象,或者提供一个方法,在方法中作出限制,保证例化对象的创建全局只有唯一一个。其好处在于可以节约系统资源,在资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如日志文件,应用配置。在控制资源的情况下,方便资源之间的互相通信。如线程池等。一般可以用于网站的计数器、web应用的日志、配置对象的读取、打印机、任务管理器、数据库连接池。其具体代码实现可以分为饿汉式和懒汉式。
/**
饿汉式 */ public class Singleton01 { public static final Singleton01 instance = new Singleton01(); private Singleton01(){
} } /**
饿汉式 */ public class Singleton02 { public static final Singleton02 instance;
static { instance = new Singleton02(); }
private Singleton02(){
}
} /**
饿汉式 / public enum Singleton03 { INSTANCE } /*
懒汉式: 存在线程安全问题 */ public class Singleton04 { private static Singleton04 instance; private Singleton04(){
}
public static Singleton04 getInstance(){ if (instance == null){ instance = new Singleton04(); } return instance; } } /**
懒汉式: 解决线程安全问题 */ public class Singleton05 { private volatile static Singleton05 instance; private Singleton05(){
}
public static Singleton05 getInstance(){ if (instance == null){ synchronized (Singleton05.class){ instance = new Singleton05(); } } return instance; } } /**
懒汉式: 内部类 */ public class Singleton06 {
private Singleton06(){
} private static class Inner{ private static final Singleton06 instance = new Singleton06(); }
public static Singleton06 getInstance(){ return Inner.instance; } }
总结:
添加 volatile 关键字之后的双重检查锁模式是一种比较好的单例实现模式,能够保证在多线程 的情况下线程安全也不会有性能问题。
静态内部类单例模式中实例由内部类创建,由于 JVM 在加载外部类的过程中, 是不会加载静态 内部类的, 只有内部类的属性/方法被调用时才会被加载, 并初始化其静态属性。静态属性由于被 static 修饰,保证只被实例化一次,并且严格保证实例化顺序。
静态内部类单例模式是一种优秀的单例模式,是开源项目中比较常用的一种单例模式。在没有加任 何锁的情况下,保证了多线程下的安全,并且没有任何性能影响和空间的浪费。
枚举类实现单例模式是极力推荐的单例实现模式,因为枚举类型是线程安全的,并且只会装载一 次,设计者充分的利用了枚举的这个特性来实现单例模式,枚举的写法非常简单,而且枚举类型是 所用单例实现中唯一一种不会被破坏的单例实现模式。