您的位置:首页 > 其它

解决多线程下单例模式中"懒汉模式"(延迟加载)的问题

2016-03-18 11:37 603 查看
获取单例对象的代码
public class MyObject {
private MyObject(){}
private static MyObject object;
public static MyObject getInstance() {
try {
if (object == null) {
object = new MyObject();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return object;
}
}
当启动多个线程执行MyObject.getInstance()的时候,获取到的对象会有多个,解决办法:
在getInstance()方法上加synchronized关键字
public class MyObject {   		   private MyObject(){}
private static MyObject object;
synchronized public static MyObject getInstance() {
try {
if (object == null) {
object = new MyObject();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return object;
}
}
这样整个方法会被上锁,效率低。
使用DCL双检查锁机制
public class MyObject {   		   private MyObject(){}
private static MyObject object;
public static MyObject getInstance() {
try {
if (object == null) {
synchronized(Myobject.class){
if(object==null){
object = new MyObject();
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return object;
}
}
使用静态内置类实现单例
			public class MyObject {
private MyObject(){}

private static class MyObjectHandler{
private static MyObject myObject = new MyObject();
}
public static MyObject getInstance() {

return MyObjectHandler.myObject;
}
}
该方法在序列化及序列化的时候前后得到的对象会发生变化,添加readResove()方法即可:
			public class MyObject implements Serializable {
private static final long serialVersionUID = 1L;
private MyObject(){}
private static class MyObjectHandler{
private static final MyObject myObject = new MyObject();
}
public static MyObject getInstance() {
return MyObjectHandler.myObject;
}
protected Object readResolve() throws ObjectStreamException{
System.out.println("调用了readResolve方法! ");
return MyObjectHandler.myObject;
}
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: