A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵国刚 中级黑马   /  2013-8-9 17:21  /  1103 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如何理解单例设计模式,具体有哪几种

4 个回复

倒序浏览
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
通常有三种形式:
第一种形式:懒汉式,注意这种形式会有多线程问题,当多条线程返问时,会造成单例失败,解决方案是在方法上加上同步
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;
}

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
吃阁子的猫 发表于 2013-8-10 11:17
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保 ...

加个锁是什么意义?我觉得反正就是一个实例,不管你谁来调,还不是只有一个实例。为什么加个锁?
回复 使用道具 举报
vampire★sky 发表于 2013-8-10 12:17
加个锁是什么意义?我觉得反正就是一个实例,不管你谁来调,还不是只有一个实例。为什么加个锁? ...

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

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

学习了:lol
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马