1 双重加锁
单利模式是设计模式中最基础的设计模式之一,且也是唯一能够使用几十行代码就能够写出来的一种设计模式,所以也是面试中经常问到的题目。
单利模式的实现比较简单,如果想要达到高效且线程安全那也是需要点技巧的。
public class Person {
private Person(){}
private static volatile Person person;
public static Person getInstance(){
if (person==null)
synchronized (Person.class){
if (person==null)
person= new Person();
}
return person;
}
}
2 静态对象(饿汉式)
使用静态对象进行单例模式的创建,利用Java中的classLoader
的机制,对静态变量只加载一次,且是线程安全的。但是该方法在程序启动时就创建了对象,对空间浪费较大。
public class Person {
private Person(){}
//method 1
private static Person person = new Person();
public static Person getInstance(){
return person;
}
}
3 静态内部类(懒汉式)
对于方法2而言,如果对类进行实例化比较消耗资源,那么饿汉式的方式显然不是最优的,那么此时依旧可以借助Java
中的classLoader
的机制,使用静态内部类进行优化,当调用了getInstance
方法时,静态内部类中的对象才被实例化,这样就实现了懒汉式的加载了。相对于第一种方法,该方法和方法2同样不需要进行加锁,效率相应的提升了。
public class Person {
private Person(){}
//method3
private static class inner{
private static final Person SINGLETON = new Person();
}
public static Person getInstance(){
return inner.SINGLETON;
}
}