立即加载/饿汉模式
立即加载的意思就是在使用类的时候已经将对象创建完毕,常见的方法就是直接new,比如下面代码
public class test{
private static MyObject myobject = new MyObject();
public static MyObject getInstance(){
return myObject;
}
}
因为getInstance方法没有同步,所以可能产生非线程安全问题
延迟加载/懒汉模式
延迟加载就是在调用get()方法时实例才被创建,常见的实现方法是在get()方法中进行new实例化,比如
class test{
private static MyObject myobject;
synchronized public static MyObject getInstance(){
if(myObject != null){}
else{
myObject = new MyObject();
}
return myObject;
}
}
但上面使用了synchronized,造成效率低下,使用synchronized代码块试试
class test{
private static MyObject myobject;
public static MyObject getInstance(){
synchronized (MyObject.class){
if(myObject != null){}
else{
myObject = new MyObject();
}
}
return myObject;
}
}
然而,这是将基本所有代码都放到了块中,对效率没有提高。使用DCL双检查锁机制!
class test{
private static MyObject myobject;
public static MyObject getInstance(){
if(myObject != null){}
else{
synchronized (MyObject.class){
if(myObject == null)
myObject = new MyObject();
}
}
return myObject;
}
}
可以看到,双检查锁机制仅对少部分代码上锁,而且在所内会进行判断,双重判断使得对象永远只有一个(不加判断将会导致依旧有多个对象)
使用静态内置类实现单例模式
class test{
private static class MyObjectHandler{
private static MyObject myobject = new MyObject();
}
public static MyObject getInstance(){
return MyObjectHandler.myObject;
}
}
由于是静态内置类,就跟饿汉模式一样,使得永远只有单例
使用static代码块实现单例模式
道理同饿汉模式
网友评论