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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谢威 中级黑马   /  2013-7-26 10:07  /  996 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜光 于 2013-7-28 09:41 编辑

延迟加载的单例设计模式的程序该怎么写?请写详细代码

评分

参与人数 1黑马币 +5 收起 理由
杜光 + 5 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

4 个回复

倒序浏览
  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. }
复制代码
回复 使用道具 举报 1 0
延迟加载的是懒汉式,如下
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;
}
}

回复 使用道具 举报
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是为了解决多线程的效率问题,这样只有第一次和第二次会判断它的锁,之后不会了
  */
}
回复 使用道具 举报
  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. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马