单例模式之懒汉模式(延迟加载)

来源:互联网 发布:mac照片图库照片路径 编辑:程序博客网 时间:2024/06/08 07:13

什么是延迟加载?延迟加载就是在调用get()方法时候创建,常见的方法就是在

get()中实例化。

看实现代码:

package test;public class MyObject {private static MyObject myObject;private MyObject() {}public static MyObject getInstance() {// 延迟加载if (myObject != null) {} else {myObject = new MyObject();}return myObject;}}

但是,这样方式的延迟加载,在多线程的环境中,就会出现错误,很严重的错误。根本不能保证单例模式的实现。

因为在getInstance中,如果有多个线程同时计入getInstance,那么就有可能new出多个MyObject。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

懒汉模式出现问题的解决方法:

①:将getInstance用synchronized修饰。

②:在getInstance方法中利用synchronized同步块或者lock进行同步。

③:使用DCL双检查机制。

针对第三种方法,看一段代码:

package test;public class MyObject {private volatile static MyObject myObject;private MyObject() {}// 使用双检测机制来解决问题// 即保证了不需要同步代码的异步// 又保证了单例的效果public static MyObject getInstance() {try {if (myObject != null) {} else {// 模拟在创建对象之前做一些准备性的工作Thread.sleep(3000);synchronized (MyObject.class) {if (myObject == null) {myObject = new MyObject();}}}} catch (InterruptedException e) {e.printStackTrace();}return myObject;}// 此版本的代码称为:// 双重检查Double-Check Locking}

如有哪疏漏,还请指出,共同学习!

0 0