黑马程序员技术交流社区
标题:
单例设计模式中的小问题!
[打印本页]
作者:
hejinzhong
时间:
2014-7-20 18:16
标题:
单例设计模式中的小问题!
单例设计模式
(1)饿汉式
class Single
{
private static final Single s = new Single();
private Sinle(){}
public static Single getInstance()
{
return s;
}
}(2)懒汉式
class Single
{
private static Single s = new Single();
private Single(){}
public static Single getInstance()
{
if(s==null)//这里判断为空的话,就会去检测锁,每次只能进去一个。
{
Synchronized(Single.class)
{
if(s==null)//这里有必要判断为空吗?能进来锁,就代表他是来创建对象的,何必再判断
Single s = new Sinle();
}
}
return s;
}
}
复制代码
作者:
陈云阳
时间:
2014-7-20 18:28
if(s==null)//这一行是用来对象创建好之后,不用再执行判断锁的作用,因为判断锁的操作比较麻烦,至少比if语句麻烦
{-A -B //假设俩个线程都正好到了这里
Synchronized(Single.class)
{
//if(s==null)//如果这一行去掉,A先进来 创建完对象出去了,B再进来又创建对象,这不是就创建两个对象了,所以这一行不能省
Single s = new Sinle();
}
}
return s
复制代码
作者:
爨庚轩
时间:
2014-7-20 18:30
if(s==null)
{ //1,2两个线程都走了到这里,1线程进去了,2线程等待1线程释放锁
Synchronized(Single.class)
{
//1线程释放锁,2线程进来了,如果不判断s==null,就会再创建一个对象
//如果!=null。就不创建
if(s==null)
Single s = new Sinle();
}
}
复制代码
作者:
何飞
时间:
2014-7-20 19:05
本帖最后由 何飞 于 2014-7-20 19:06 编辑
(2)懒汉式:延迟加载方式
class Single
{
//private static Single s = new Single();
private static Single s = null;//此处不实例化
private Single(){}
public static Single getInstance()
{
if(s==null)//这里判断为空的话,就会去检测锁,每次只能进去一个。
{
Synchronized(Single.class)
{
//这里肯定要判断啊,如果线程a执行完此处的代码块,在a执行的过程中线程b已经经过第一次判断,
//到了Synchronized代码块之前,那么等b拿到锁就会进来这里,如果不判断s是否为空,就会第二次实例化了
//这样就不是单例了~~
if(s==null)//这里有必要判断为空吗?能进来锁,就代表他是来创建对象的,何必再判断
Single s = new Sinle();
}
}
return s;
}
}
复制代码
作者:
hejinzhong
时间:
2014-7-20 19:13
是这么回事。
作者:
黄宝宝
时间:
2014-7-20 19:15
楼上正解!
作者:
F@C
时间:
2014-7-20 22:24
进来学习
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2