单例模式的概念
在运行期间,保证某个类只创建一个实例,保证一个类仅有一个实例,并提供一个访问它的全局访问点。下面就来讲讲Java中的N种实现单例模式的写法。
饿汉模式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
//提供一个全局访问的节点
public static Singleton getInstance() {
return instance;
}
}
为什么叫做饿汉模式呢?因为我现在很饿,所以想直接创建直接使用不想等待,这种写法在类加载的时候就把Singleton视力创建出来了
接下来是懒汉模式
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
懒汉模式是不去创建,而是在我要用的时候在创建出来。但是懒汉模式又存在着线程安全的问题
所以下面用关键字给他锁起来。
public class SingletonSafe {
private static volatile SingletonSafe singleton;
private SingletonSafe() {
}
public static SingletonSafe getSingleton() {
if (singleton == null) {
synchronized (SingletonSafe.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;
}
}
通过静态内部类的方式实现单例模式是线程安全的,同时静态内部类不会在Singleton类加载时就加载,而是在调用getInstance()方法时才进行加载,达到了懒加载的效果。
现在介绍一下枚举类型:单例实现模式就是枚举模式:enum
public enum Singleton {
INSTANCE;
public void doSomething() {
System.out.println("doSomething");
}
}
调用方法
public class Main {
public static void main(String[] args) {
Singleton.INSTANCE.doSomething();
}
}