单例设计模式的形式
1.饿汉式
class Singleton{
//私有化 防止外部直接new 造成线程不安全
private Singleton(){}
private static Singleton instance=new Singleton();
public static Singleton getInstance(){
return instance;
}
}
特点:线程安全。但是在初始化的时候,就创建了对象,不一定能用到,容易造成资源浪费。
2. 懒汉式
class Singleton{
private Singleton(){}
private static Singleton instance;
public static Singleton getInstance(){
if(instance==null)
instance=new Singleton();
return instance;
}
}
特点:实现了延迟加载,但是这种写法只能在单线程下使用,多线程会出现先传给你安全,因为可能两个线程同时进入判断语句,而此时确实都不成立,就不是单例了。
class Singleton{
private Singleton(){}
private static Singleton instance;
public static synchronized Singleton getInstance(){
if(instance==null)
instance=new Singleton();
return instance;
}
}
特点:线程同步,安全,但是实例化只需要一次,后面的直接进行return就行了,这个每次都要再进行判断,效率太低。
class Singleton{
private Singleton(){}
private static Singleton instance;
public static Singleton getInstance(){
if(instance==null){
synchronized (Singleton.class){
instance=new Singleton();
}
}
return instance;
}
}
特点:此种方法问题就很大了!!如果进入,在判断的时候就已经进入了,所以在那里加锁并没有意义。
3. Double-Check
class Singleton{
private Singleton(){}
private static Singleton instance;
public static Singleton getInstance(){
if(instance==null){
synchronized (Singleton.class){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
特点:线程安全,线程同步,效率较高。不错!!
4. 静态内部类
class Singleton{
private Singleton(){}
private static class SingletonInstance{
private static final Singleton INSTANCE=new Singleton();
}
public static synchronized Singleton getInstance(){
return SingletonInstance.INSTANCE;
}
}
5. 枚举
public class demo1 {
public static void main(String[] args) {
Singleton instance = Singleton.INSTANCE;
Singleton instance1 = Singleton.INSTANCE;
System.out.println(instance==instance1); //true
}
}
enum Singleton{
INSTANCE;
}
特点:这种方法安全,效率高,主要是看着就很,对吧。但是,底层原理是什么?
应用场景
1.对于需要频繁的创建销毁的对象,使用单例,节约了系统资源。
【注意】:这里不直接new是因为想用延迟加载。