黑马程序员技术交流社区

标题: 线程并发访问问题 [打印本页]

作者: 陈苓    时间: 2012-4-11 01:08
标题: 线程并发访问问题
class Single{
  private static final s = null;
  private Single(){}
  public static void  getInstance(){
          if(s==null)  //这里要多加一次判断,这里的判断目的也有点模糊         synchronized(Slingle.class)
             if(s==null)//这里判断的时候,如果有多条线程,一线程进来出去之后其他的的线程进进步来,怎么有点模糊         {
        
                   s = new Single();
         }
             return s;

          }
   }

该贴已经同步到 格式化的微博
作者: 陈苓    时间: 2012-4-11 01:09
class Single{
  private static final s = null;
  private Single(){}
  public static void  getInstance(){
          if(s==null)  //这里要多加一次判断,这里的判断目的也有点模糊      
  synchronized(Slingle.class)
             if(s==null)//这里判断的时候,如果有多条线程,一线程进来出去之后其他的的线程进进步来,怎么有点模糊         {
        
                   s = new Single();
         }
             return s;

          }
   }

上面没有换行,不好看
作者: 未长法    时间: 2012-4-11 08:38
class Single{
   private static final s = null;
   private Single(){}
   public static void  getInstance(){
           if(s==null)  //这里要多加一次判断,这里的判断目的判断进来的线程是否为空   
  synchronized(Slingle.class)
              if(s==null)//这里判断的时候,如果有多条线程,一线程进来出去之后其他的的线程如果想进来得先判断锁      
{
                   A------>
                    s = new Single();
          }
              return s;

          }
    }
这样双重判断,首先如果一个线程A进来了,判断为空,那么进来判断也满足条件 A线程如图 ,,这时又进来一个B线程进来,判断s==null,所以 进来,因为有锁,进不去,然后线程A new了一个对象然后出去了,这时线程B 进去了,再次判断s==null,不满足条件,因此进不去。此时如果在来一个C线程先判断第一个s==null,就不满足条件,所以不用判断锁。减少了判断锁的次数,提高了懒汉式的效率。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2