黑马程序员技术交流社区

标题: 单例设计模式 [打印本页]

作者: 赵国刚    时间: 2013-8-9 17:21
标题: 单例设计模式
如何理解单例设计模式,具体有哪几种
作者: 吃阁子的猫    时间: 2013-8-10 11:17
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
通常有三种形式:
第一种形式:懒汉式,注意这种形式会有多线程问题,当多条线程返问时,会造成单例失败,解决方案是在方法上加上同步
public class Singleton {
private static Singleton instance = null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}
}
第二种形式:
public class Singleton {
//在自己内部定义自己的一个实例,只供内部调用
private static Singleton instance = new Singleton();
private Singleton(){
//do something
}
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance(){
return instance;
}
}
第三种形式: 双重锁的形式。
public class Singleton {
private static Singleton instance = null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
if(null == instance){
instance = new Singleton();
}
}
}
return instance;
}

作者: vampire★sky    时间: 2013-8-10 12:17
吃阁子的猫 发表于 2013-8-10 11:17
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保 ...

加个锁是什么意义?我觉得反正就是一个实例,不管你谁来调,还不是只有一个实例。为什么加个锁?
作者: 吃阁子的猫    时间: 2013-8-10 13:21
vampire★sky 发表于 2013-8-10 12:17
加个锁是什么意义?我觉得反正就是一个实例,不管你谁来调,还不是只有一个实例。为什么加个锁? ...

下面这一步如果不加锁,懒汉式在多线程中,多个线程访问instance,一个线程访问,判断为空.进来,,程序没有马上运行,(中间会有停留的时间),另一个线程访问,判断为空,又进来了,可能不会马上执行,前一个进程(或多个)进程开始运行,创建对象,注意,现在里面并不只是一个线程,因此在这里会创建多个对象,进而破坏对象的唯一性
if(null == instance){
   instance = new Singleton();
}

还有补充的一点是,第三种双重锁是造成死锁,不能使用,尽量避免
作者: vampire★sky    时间: 2013-8-10 15:18
吃阁子的猫 发表于 2013-8-10 13:21
下面这一步如果不加锁,懒汉式在多线程中,多个线程访问instance,一个线程访问,判断为空.进来,,程序没有马 ...

学习了:lol




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2