单例
单例
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();
}
}

浙公网安备 33010602011771号