主要解决:一个全局使用的类频繁地创建与销毁。
1、饿汉式(线程安全,调用效率高,但是不能延时加载) 简单实用
public class Singleton{
private static final Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
2.懒汉式(线程不安全,调用效率不高,但是能延时加载)
public class Singleton{
private static Singleton singleton;//未初始化
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
3.懒汉式 加锁
public class Singleton{
private static Singleton singleton;//未初始化
private Singleton(){}
public static synchronized Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
4.Double CheckLock实现单例
public class Singleton{
private static volatile INSTANCE; //JIT
private Singleton() {
}
public static getInstance() {
if (INSTANCE == null) {
//双重检查
synchronized (Singleton.class) {
if(INSTANCE == null) {
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}
5.静态内部类方式 (JVM保证单例、加载外部类时不会加载内部类,这样可以实现懒加载)推荐
public class Mgr07 {
private Mgr07() {
}
private static class Mgr07Holder {
private final static Mgr07 INSTANCE = new Mgr07();
}
public static Mgr07 getInstance() {
return Mgr07Holder.INSTANCE;
}
}
6.枚举类(不仅可以解决线程同步,还可以防止反序列化。(没构造方法,所以无法通过classloader反射实例化))
public enum Mgr08 {
INSTANCE;
public void m() {}
}