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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM何伟 中级黑马   /  2013-4-1 23:11  /  1214 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 HM何伟 于 2013-4-2 00:25 编辑

这段代码有安全问题没??
  1. class Single{
  2.          private Single(){}
  3.          private static Single s=null;
  4.          public static Single getOop()
  5.          {
  6.                 synchronized(Single.class)
  7.                 {                                
  8.                         if (s==null)//?????????
  9.                
  10.                         try
  11.                                 {
  12.                                   Thread.sleep(20);
  13.                                 }
  14.                                 catch (Exception e)
  15.                                 {
  16.                                 }
  17.                                 
  18.                                 s=new Single();
  19.                           return s;
  20.                 }
  21.                  //return s;
  22.          }
  23. }
  24. class Test implements Runnable{
  25.         public void run()
  26.         {
  27.           while(true)
  28.          {
  29.                 Single s = Single.getOop();
  30.                    System.out.println(s);
  31.          }
  32.         }
  33. }
  34. class Main{

  35.         public static void main(String[] args){
  36.                            Test t=new Test();
  37.                         Thread t1=new Thread(t);
  38.                         Thread t2=new Thread(t);
  39.                         Thread t3=new Thread(t);
  40.                         t1.start();
  41.                         t2.start();
  42.                         t3.start();
  43.                  
  44.         }
  45. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
   if (s==null)//?????????if的大括号呢,没有大括号,if不能判断,程序会不停new Single对象的
               
                        try
                                {
                                  Thread.sleep(20);
                                }
                                catch (Exception e)
                                {
                                }
                                
                                s=new Single();
                          return s;

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
这段懒汉式应该synchronized前面使用双if在判断,否则会出现错误.
代码如下:
class Single{
         private Single(){}
         private static Single s=null;
         public static Single getOop()
         {
                         if (s == null)//如果已经赋值就直接返回return
                         {
                 
                                 synchronized(Single.class)
                {                                
                   if (s == null)
                                 {   
                        try
                                {
                                  Thread.sleep(20);
                                }
                                catch (Exception e)
                                {
                                }
                                
                                s=new Single();
                          return s;
                }
              
                                 }
                         }  
                         return s;
         }
}
class Test implements Runnable{
        public void run()
        {
          while(true)
         {
                Single s = Single.getOop();
                   System.out.println(s);
         }
        }
}
class Test5{

        public static void main(String[] args){
                           Test t=new Test();
                        Thread t1=new Thread(t);
                        Thread t2=new Thread(t);
                        Thread t3=new Thread(t);
                        t1.start();
                        t2.start();
                        t3.start();
                 
        }
}

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
记得及时处理帖子哦~
回复 使用道具 举报
黑马李超 发表于 2013-4-1 23:46
if (s==null)//?????????if的大括号呢,没有大括号,if不能判断,程序会不停new Single对象的
          ...

明白了,难怪地值会一直不一样
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马