单例模式
1.饿汉式(静态常量)
构造器私有化(防止new); 类的内部创建对象; 向外暴露一个公共静态方法。
class Singleton {
private Singleton ( ) {
}
private final static Singleton singleton = new Singleton ( ) ;
public static Singleton getInstance ( ) {
return singleton;
}
}
2.饿汉式(静态代码块)
class Singleton02 {
private Singleton02 ( ) {
}
private static Singleton02 singleton;
static {
singleton = new Singleton02 ( ) ;
}
public static Singleton02 getInstance ( ) {
return singleton;
}
}
优点:
缺点:
3.懒汉式(线程不安全)
class Singleton03 {
private Singleton03 ( ) {
}
private static Singleton03 singleton;
public static Singleton03 getInstance ( ) {
if ( singleton == null) {
singleton = new Singleton03 ( ) ;
}
return singleton;
}
}
优点:
缺点:
4.懒汉式(线程安全)
class Singleton04 {
private Singleton04 ( ) {
}
private static Singleton04 singleton;
public static synchronized Singleton04 getInstance ( ) {
if ( singleton == null) {
singleton = new Singleton04 ( ) ;
}
return singleton;
}
}
优点:
缺点:
5.懒汉式(同步代码块)
class Singleton05 {
private Singleton05 ( ) {
}
private static Singleton05 singleton;
public static Singleton05 getInstance ( ) {
if ( singleton == null) {
synchronized ( Singleton05. class ) {
singleton = new Singleton05 ( ) ;
}
}
return singleton;
}
}
6.DCL(Double Check Lock)
class Singleton06 {
private Singleton06 ( ) {
}
private static volatile Singleton06 singleton;
public static Singleton06 getInstance ( ) {
if ( singleton == null) {
synchronized ( Singleton06. class ) {
if ( singleton == null) {
singleton = new Singleton06 ( ) ;
}
}
}
return singleton;
}
}
优点:
7.静态内部类
class Singleton07 {
private Singleton07 ( ) {
}
private static class SingleInstance {
private static final Singleton07 INSTANCE = new Singleton07 ( ) ;
}
public static Singleton07 getInstance ( ) {
return SingleInstance. INSTANCE;
}
}
优点:
加载内部类的时候创建对象保证了线程安全,又起到懒加载作用,推荐使用。
8.枚举方式
enum Singleton08{
INSTANCE
}
优点:
避免多线程同步问题,防止反序列化重新创建对象,推荐使用。
JDK源码的单例模式使用:
public class Runtime {
private static Runtime currentRuntime = new Runtime ( ) ;
public static Runtime getRuntime ( ) {
return currentRuntime;
}
private Runtime ( ) { }
单例模式总结:
单例模式保证了系统内该类只存在一个对象实例,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。 单例模式的使用场景:需要频繁创建和销毁的对象,创建对象耗时过多或耗费资源过多(重量级对象),但又经常用到的对象,工具类对象,频繁访问数据库或文件的对象(数据源、session工厂等)。