单例模式要点:
1:构造函数私多余的对象
2:只能拥有一个对象
饿汉式(最简单的一种写法,类加载直接new出一个对象)
class Singleton{
private static final Singleton singleton = new Singleton();
public static Singleton getInstance(){
return singleton;
}
}
懒汉式
1.线程不安全写法,多线程可能会同时new对象
class Singleton{
private Singleton(){};
private static final Singleton singleton = null;
public static Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
2.线程安全写法,但效率太低,一般不用 加synchronized
class Singleton{
private Singleton(){};
private static final Singleton singleton = null;
public static synchronized Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
3.双重校验锁,较常用,解决线程问题和效率问题
class Singleton{
private Singleton(){};
private static final Singleton singleton = null;
public static Singleton getInstance(){
if(singleton == null){
synchronized (Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
4.静态内部类
class Singleton{
private Singleton(){};
private static class InstanceHolder(){
private static final Singleton SINGLETON= new Singleton();(定义常量都大写)
}
public static Singleton getInstance(){
return InstanceHolder.SINGLETON;
}
}