黑马程序员技术交流社区
标题:
单例设计模式
[打印本页]
作者:
hadexs
时间:
2013-6-23 12:18
标题:
单例设计模式
本帖最后由 Super_Class 于 2013-6-24 18:39 编辑
懒汉式与饿汉式有什么区别啊?开发时大多数情况用什么模式?
作者:
shang1jk
时间:
2013-6-23 12:47
饿汉式是直接随着类的加载直接生成对象, 而懒汉式是调用一个类的类似getInstance方法的时候, 变判断是否已经有这个对象了, 如果有直接用, 如果没有就生成一个.
建议使用懒汉式,
懒汉式的缺点: 延迟加载, 所以线程不安全, 使用synchronized解决之后效率稍降低.
作者:
高波
时间:
2013-6-23 13:22
饿汉式:先初始化对象,类一进内存,就已经创建好对象;
懒汉式:对象是方法被调用时,才初始化,也叫做对象的延时加载。
记录原则:定义单例,建议使用饿汉式。
懒汉式存在缺点,线程不安全,使用synchronized,效率会降低,使用双重判断,代码繁琐。
饿汉式:
class Single {
private static Single s = new Single();
private Single() {
}
public static Single getInstance() {
return s;
}
}
复制代码
懒汉式:
class SingleTest {
private static SingleTest s = null;
private SingleTest() {
}
public static SingleTest getInstance() {
if (s == null) {
synchronized (SingleTest.class) {
if (s == null)
s = new SingleTest();
}
}
return s;
}
}
作者:
280270738
时间:
2013-6-23 15:51
饿汉式是先定义对象,懒汉式是后加载对象。开发时一般用饿汉式。因为懒汉式在多线程中会引发安全问题。
作者:
sunriselzz
时间:
2013-6-23 21:25
单例设计模式:
大家都知道单例有“懒汉式”和“饿汉式”.
其实张老师提到过单例还有一种实现方式,那就是“枚举”。
因为枚举也是不能用 new 来创建对象的,所以当枚举中只定义了一个对象值时,就成了特殊的单例。
单例写法两种:
(1)饿汉式 开发用这种方式。
先初始化对象,类一进内存,就已经创建好对象;
class Student
{
private Student(){}
private static Student s = new Student();
public static Student getInstance()
{
return s;
}
}
(2)懒汉式 面试写这种方式。
对象是方法被调用时,才初始化
懒汉式就是延迟加载,但一般的形式会出现线程安全问题.
所以出现了以下的改良版:通过加锁保证线程安全,双重判断提高效率
class Teacher
{
private Teacher(){}
private static Teacher t;
public static Teacher getInstance()
{
synchronized(Teacher.class)
{
if(t==null)
{
t = new Teacher();
}
}
return t;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2