单例模式简介
单例模式可以说是大多数开发人员在实际中使用最多的,常见的Spring默认创建的bean就是单例模式的。
单例模式有很多好处,比如可节约系统内存空间,控制资源的使用。
其中单例模式最重要的是确保对象只有一个。
简单来说,保证一个类在内存中的对象就一个。
RunTime就是典型的单例设计,我们通过对RunTime类的分析,一窥究竟。
package java.lang;
public class Runtime {
//创建静态的全局唯一的对象
private static Runtime currentRuntime = new Runtime();
//私有构造方法,不让外部来调用
/** Don't let anyone else instantiate this class */
private Runtime() {}
//3、通过自定义的静态方法获取实例
public static Runtime getRuntime() {
return currentRuntime;
}
}
饿汉式:实现简单,安全可靠
public class Singleton {
//封装创建好的对象
private static Singleton instance = new Singleton();
//私有化构造方法
private Singleton() {}
//提供公共的获取对象的方法
public static Singleton getInstance() {
return instance;
}
}
懒汉式:在真正需要的时候再去创建实例
public class SingletonSafe {
//封装创建好的对象
private static volatile SingletonSafe singleton;
//私有化改造方法
private SingletonSafe() {}
//提供公共的获取对象的方法
synchronized public static SingletonSafe getSingleton() {//可以是同步方法
if (singleton == null) {
// synchronized (SingletonSafe.class) {//同步代码块,静态方法的锁,是类名.class本类的字节码对象
if (singleton == null) {
singleton = new SingletonSafe();
}
// }
return singleton;
}
}
静态内部类:在调用方法时才进行加载
public class Singleton {
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
枚举:利用枚举的特性,让JVM帮我们保证线程安全和单一实例的问题,写法简单。
public enum Singleton {
INSTANCE;
public void enumeration() {
System.out.println("enumeration");
}
}
调用方法:
public class test {
public static void main(String[] args) {
Singleton.INSTANCE.enumeration();
}
}