黑马程序员技术交流社区
标题:
大家帮我解答一下,单例的懒汉模式吧
[打印本页]
作者:
xiaobei56
时间:
2015-12-17 23:13
标题:
大家帮我解答一下,单例的懒汉模式吧
问题在代码 写清楚了,,大神给看一下解释一下吧
Single.java
package com.xiaobei.test;
/*
* 单例 :懒汉模式
* 高效的懒汉模式 实例
* 疑问:
* 为什么 再 synchronous之后 那个if(s==null) 不能去掉
* 老师给我们解释说,在sychronous(Single.class) 会出现卡住现象
* 从而会又new Single.....但是我理解的
* sychronous()的功能不就是,防止 卡住一类的现象,实现 同步吗???
* 那要是这里能卡住,,,那其他同步应用 synchronous的 时候 ,是不是也会卡住,是不是也需要在其后面加个判断哪????/
* 希望 大神 给解释一下/////////////
*/
public class Single {
private Single() {
}
Single s = null;
public Single getInstance() {
if (s == null) {
synchronized (Single.class) {//老师给我们解释说 这里或在 取 Single.class的时候会卡住,
if (s == null) {//大神(最好是老师哈)给解释一下为什么这个if不能去掉吗
s = new Single();
}
}
}
return s;
}
}
复制代码
SingleDemo.java
package com.xiaobei.test;
/*
* 测试单例模式,懒汉式
*/
class SingleRunnable implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 20; i++) {
Single s=Single.getInstance();
System.out.println(s);
}
}
}
public class SingleDemo {
public static void main(String[] args) {
SingleRunnable s=new SingleRunnable();
Thread t0=new Thread(s);
Thread t1=new Thread(s);
t0.start();
t1.start();
}
}
复制代码
作者:
xiaobei56
时间:
2015-12-17 23:14
大家帮忙给解释一下啊
作者:
迷茫不堪的年纪
时间:
2015-12-17 23:20
懒汉单例 是拿内存换时间, 提升效率.叫懒汉的原因是if那个判断, 也就是有需求才去创建没的话就继续偷懒
作者:
Mr.zhao
时间:
2015-12-18 00:37
还没看到这个知识点
作者:
李永佳
时间:
2015-12-18 11:33
你的问题应该是,if(s==null){s=new Single();} 这句话会卡住,因为在做if判断时,一个线程停在这里,另一个线程又进来了,导致两个线程都是true,都创建对象,那就不是单例了。
作者:
Hi.。
时间:
2015-12-18 12:11
public Single getInstance() {
if (s == null) {
// 第一次,s=null,t1 t2线程执行到这里
synchronized (Single.class) {
//t1拿到锁,进来。创建完对象,出去
//t2拿到锁,进来。发现s != null,直接出去。 如果没有这一层判断,会再建一个对象
if (s == null) {
s = new Single();
}
}
}
return s;
}
复制代码
作者:
魏志林
时间:
2015-12-18 12:45
需要学习下,不太懂
作者:
xiaobei56
时间:
2015-12-18 21:03
Hi.。 发表于 2015-12-18 12:11
嗯嗯 我觉得你解释很对啊,,,这样可以解释通了,,,当时老师给我们说 在synchronized那卡住,,,怎么想也想不通 谢谢啦
作者:
river1205
时间:
2015-12-18 21:13
只定义,用到再new
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2