黑马程序员技术交流社区

标题: 关于单例模式的问题 [打印本页]

作者: 谢威    时间: 2013-7-26 10:07
标题: 关于单例模式的问题
本帖最后由 杜光 于 2013-7-28 09:41 编辑

延迟加载的单例设计模式的程序该怎么写?请写详细代码
作者: 王靖远    时间: 2013-7-26 10:17
  1. public class Single {
  2.         private Single(){}
  3.         private static Single s = null;
  4.         public static Single getSingle(){
  5.                 if(s==null){
  6.                         synchronized (Single.class) {
  7.                                 if(s==null){
  8.                                         s = new Single();
  9.                                 }
  10.                                         return s;
  11.                                
  12.                         }
  13.                 }
  14.                 return s;
  15.         }
  16. }
复制代码

作者: 李政    时间: 2013-7-26 10:21
延迟加载的是懒汉式,如下
class Single
{
private static Single s = null;//这里先不在内存中建立实例对象
private Single(){}
public static Single getInstance()//当函数被调用的时候再建立
{
  if(s==null)
  {
   synchronized(Single.class)//进行双重判断,将锁放到函数里面,相比同步函数,运算较快
   {   
    if(s==null)
     s = new Single();
   }
  }
  return s;
}
}


作者: wang100753    时间: 2013-7-26 10:37
package demo.one;

/**
*
* 单例设计模式 1:饿汉式 2:懒汉式(又称单例模式的延迟加载)
*
*/
public class Single {
/**  这里的整个是饿汉式的单例模式
private static final Single single = new Single();

private Single() {
}

public static Single getInstance() {
  return single;
}
*/



/********以下是单例模式中的懒汉式 也称单例模式的延迟加载****************/

private static Single single=null;
/**  注意这里是不考虑多线程的时候的单例模式
public static Single getInstance(){
  if(single==null)
   single=new Single();
  return single;
}
*/

//下面是考虑多线程的延迟加载的单例模式

public static Single getInstance(){
  if(single==null){
    synchronized(Single.class){
     if(single==null)
      single=new Single();
   }
  }
  
  return single;
}

/**
  * 以上是多线程的单例延迟加载模式
  * 注意这里面试经常问的问题
  * 1:让你写一个延迟加载的单例模式就写这个
  * 2:synchronized(Single.class)多线程中的锁为什么用的是Single.class
  * 因为哲理是一个static,多线程中对static的加锁是它的对象的.class,也就是该对象所属的字节码对象
  * 3:双重if是为了解决多线程的效率问题,这样只有第一次和第二次会判断它的锁,之后不会了
  */
}

作者: xscn    时间: 2013-7-26 10:46
  1. class Single
  2. {
  3.         private static Single s = null;
  4.         private Single(){}
  5.         public static Single getInstance()
  6.         {
  7.                 if(s==null)//检查实例是否存在,如果不存在进入下面的synchronized代码块
  8.                 {
  9.                         synchronized(Single.class)
  10.                         {                                
  11.                                 if(s==null)//拿到锁后再次判断实例是否存在,如果不存在才创建实例
  12.                                         s = new Single();
  13.                         }
  14.                 }
  15.                 return s;
  16.         }
  17. }
复制代码





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