单例

单例

1.饿汉式:

/**
 * 饿汉式
 * 事先创建
 */
public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }

}

基于classloder的机制解决的重复创建的问题,但是如果一个虚拟机里有多个classloder的话可能会创建出多个实例.

2.懒汉式

/**
 * 饿汉式
 * 需要使用的时候创建
 */
public class Singleton {

    private static Singleton instance;

    private Singleton() {
    }

    public static synchronized Singleton getInstance() {
        if(null==instance){
            instance=new Singleton();
        }
        return instance;
    }

}

在多线程中可以很好的工作,但是在99%的使用场景长不需要同步.

3.枚举

public enum  Singleton {

    instance;

    public void method(){

    }

}

不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象.

4.双重校验锁

/**
 * 双重校验锁
 */
public class Singleton {

    private static volatile Singleton instance;

    private Singleton() {

    }

    public static Singleton getInstance() {
        if (null == instance) {
            synchronized (Singleton.class) {
                if (null == instance) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

这样方式实现线程安全地创建实例,而又不会对性能造成太大影响。它只是第一次创建实例的时候同步,以后就不需要同步了。

由于volatile关键字屏蔽了虚拟机中一些必要的代码优化,所以运行效率并不是很高,因此建议没有特别的需要不要使用。双重检验锁方式的单例不建议大量使用,根据情况决定

5.静态内部类

/**
 * 静态内部类
 */
public class Singleton {

    private Singleton() {

    }

    public static Singleton getInstance() {
        return SingleHolder.instance;
    }

    private static class SingleHolder {

        private static final Singleton instance = new Singleton();

    }

}
posted @ 2020-03-10 23:02  continued258  阅读(110)  评论(0)    收藏  举报