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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

问题在代码 写清楚了,,大神给看一下解释一下吧
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. }
复制代码

8 个回复

倒序浏览
大家帮忙给解释一下啊
回复 使用道具 举报
懒汉单例 是拿内存换时间, 提升效率.叫懒汉的原因是if那个判断, 也就是有需求才去创建没的话就继续偷懒
回复 使用道具 举报
还没看到这个知识点
回复 使用道具 举报
你的问题应该是,if(s==null){s=new Single();} 这句话会卡住,因为在做if判断时,一个线程停在这里,另一个线程又进来了,导致两个线程都是true,都创建对象,那就不是单例了。
回复 使用道具 举报
  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:33
7#
需要学习下,不太懂
回复 使用道具 举报
xiaobei56 来自手机 中级黑马 2015-12-18 21:03:24
8#
Hi.。 发表于 2015-12-18 12:11

嗯嗯   我觉得你解释很对啊,,,这样可以解释通了,,,当时老师给我们说  在synchronized那卡住,,,怎么想也想不通  谢谢啦
回复 使用道具 举报
river1205 来自手机 中级黑马 2015-12-18 21:13:48
9#
只定义,用到再new
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马