黑马程序员技术交流社区

标题: 大家帮我解答一下,单例的懒汉模式吧 [打印本页]

作者: xiaobei56    时间: 2015-12-17 23:13
标题: 大家帮我解答一下,单例的懒汉模式吧
问题在代码 写清楚了,,大神给看一下解释一下吧
Single.java
  1. package com.xiaobei.test;

  2. /*
  3. * 单例  :懒汉模式
  4. *                 高效的懒汉模式 实例
  5. * 疑问:  
  6. *                 为什么 再 synchronous之后   那个if(s==null) 不能去掉
  7. *                 老师给我们解释说,在sychronous(Single.class)  会出现卡住现象
  8. *                 从而会又new Single.....但是我理解的  
  9. *                 sychronous()的功能不就是,防止 卡住一类的现象,实现 同步吗???
  10. *                 那要是这里能卡住,,,那其他同步应用 synchronous的 时候 ,是不是也会卡住,是不是也需要在其后面加个判断哪????/
  11. *                 希望  大神 给解释一下/////////////
  12. */
  13. public class Single {
  14.         private Single() {
  15.         }

  16.         Single s = null;

  17.         public Single getInstance() {
  18.                 if (s == null) {
  19.                         synchronized (Single.class) {//老师给我们解释说 这里或在  取 Single.class的时候会卡住,
  20.                                 if (s == null) {//大神(最好是老师哈)给解释一下为什么这个if不能去掉吗
  21.                                         s = new Single();
  22.                                 }
  23.                         }
  24.                 }
  25.                 return s;
  26.         }
  27. }
复制代码


SingleDemo.java
  1. package com.xiaobei.test;
  2. /*
  3. * 测试单例模式,懒汉式
  4. */
  5. class SingleRunnable implements Runnable{

  6.         @Override
  7.        
  8.         public void run() {
  9.                 // TODO Auto-generated method stub
  10.                 for (int i = 0; i < 20; i++) {
  11.                         Single s=Single.getInstance();
  12.                         System.out.println(s);
  13.                 }
  14.         }
  15.        
  16. }
  17. public class SingleDemo {
  18.         public static void main(String[] args) {
  19.                 SingleRunnable s=new SingleRunnable();
  20.                 Thread t0=new Thread(s);
  21.                 Thread t1=new Thread(s);
  22.        
  23.                 t0.start();
  24.                 t1.start();
  25.                
  26.         }
  27. }
复制代码

作者: 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
  1. public Single getInstance() {
  2.                 if (s == null) {
  3.                         // 第一次,s=null,t1 t2线程执行到这里
  4.                         synchronized (Single.class) {
  5.                                 //t1拿到锁,进来。创建完对象,出去
  6.                                 //t2拿到锁,进来。发现s != null,直接出去。        如果没有这一层判断,会再建一个对象
  7.                                 if (s == null) {
  8.                                         s = new Single();
  9.                                 }
  10.                         }
  11.                 }
  12.                 return s;
  13.         }
复制代码



作者: 魏志林    时间: 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