注册 登录
编程论坛 JAVA论坛

关于java中单例模式的介绍(懒汉模式,饿汉模式)

疯狂的小a 发布于 2018-04-17 19:37, 2619 次点击
懒汉模式:创建对象之前会做一非空判断,如果有现成的对象,就不创建新的,没有现成的就创建一个新的。
程序代码:
package com.xiaoa.demo;

/**

 * 懒汉模式

 *

 *
@author niyite

 *

 
*/
public class LazySingle {
    private static LazySingle newInstance = null;

    private LazySingle() {
    }

    public static LazySingle getnewInstance() {
        if (newInstance == null) {
            newInstance = new LazySingle();
        }
        return newInstance;
    }
}

加锁懒汉模式,在创建新对象之前加了一个同步锁,避免了多线程情况下的线程安全问题。
程序代码:
package com.xiaoa.demo;

/**

 * 加锁懒汉模式

 *

 *
@author niyite

 *

 
*/
public class SyncLazySingle {
    private static SyncLazySingle newInstance = null;

    private SyncLazySingle() {
    }

    public static SyncLazySingle getnewInstance() {
        if (newInstance == null) {
            synchronized (SyncLazySingle.class) {
               if (newInstance == null) newInstance = new SyncLazySingle();
            }
        }
        return newInstance;
    }
}

 饿汉模式:操作最简单
程序代码:
package com.xiaoa.demo;

/**

 * 饿汉模式

 *

 *
@author niyite

 *

 
*/
public class HungrySingle {
    private static final HungrySingle newInstance = new HungrySingle();

    public HungrySingle() {
    }

    public static HungrySingle getnewInstance() {
        return newInstance;
    }

}


[此贴子已经被作者于2018-4-19 08:29编辑过]

6 回复
#2
有多难2018-04-18 22:58
为什么单例模式会有懒汉和饿汉的区别?有什么区别?
#3
林月儿2018-04-18 23:48
[quote]以下是引用疯狂的小a在2018-4-17 19:37:08的发言:

加锁懒汉模式,在创建新对象之前加了一个同步锁,避免了多线程情况下的线程安全问题。
package com.xiaoa.demo;

/**
 * 加锁懒汉模式
 *
 * @author niyite
 *
 */
public class SyncLazySingle {
    private static SyncLazySingle newInstance = null;

    private SyncLazySingle() {
    }

    public static SyncLazySingle getnewInstance() {
        if (newInstance == null) {
            synchronized (SyncLazySingle.class) {
                newInstance = new SyncLazySingle();
            }
        }
        return newInstance;
    }
}




版主你这个懒汉模式不行啊,要是里面还没创建好,外面的线程就到if那边判空,释放锁之后再进去创建的话。。。。不是产生多个实例吗?
#4
疯狂的小a2018-04-19 08:31
回复 3楼 林月儿
眼神真好!感谢!!
已经修改,应该再没问题了吧....
#5
疯狂的小a2018-04-19 08:34
回复 楼主 疯狂的小a
有区别的,单例模式是表示单例的,是一种思想。比如如果一个对象很复杂,占用资源太多,就要求是单例的。
#6
springtime2018-04-25 22:31
#7
asd7694969432020-03-18 10:47
问一下 怎么用懒汉模式实现任务管理器啊
1