Chapter 58 设计模式简介2013_图文.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* 负载均衡器的设计 ----饿汉式单例与懒汉式单例的讨论(或资源抢占式) 饿汉式单例类的设计:在定义静态变量时直接实例化单例类,因此在类加载时,静态变量instance会被初始化,此时类的私有构造函数会被调用,单例类的唯一实例就将被创建。 public class LoadBalancer { //以下私有静态实例变量 private static final LoadBalancer instance=new LoadBalancer(); private LoadBalancer() { … } //私有初始化窗口 // 以下方法为公有静态成员,返回唯一实例。 public static LoadBalancer getInstance(){ return instance; } } 那么, 观察上述示例程序, 饿汉式单例类设计有什么问题? * 负载均衡器的设计 ----饿汉式单例与懒汉式单例的讨论 饿汉式单例类的优点: 在类加载时就将自己实例化,无需考虑多线程访问问题,可以确保实例的唯一性; 单例的创建时调用速度比较快。 饿汉式单例类的缺点: 该方式不能实现单例类的延迟加载,不管将来使用与否,该方式始终占用资源,这样的实例对象在大型软件系统里面如果过多的话,会影响系统性能。 问题:大型软件系统设计中单例类一般要求延迟加载(用到的时候再加载,不用时想办法卸载)以节省系统资源。 * 负载均衡器的设计 ----饿汉式单例与懒汉式单例的讨论 懒汉式单例类与线程锁定:懒汉式单例在第一次调用getInstance()方法时实例化,在类加载时并不自行实例化,这种技术成为“延迟加载(Lazy Load)技术”;另外为了避免多个线程同时调用getInstance()方法,可以使用关键字synchronized用以线程锁定(多线程下,按访问顺序优先锁定第一个线程)。 public class LoadBalancer { private static LoadBalancer instance=null; //私有静态变量 private LoadBalancer() { … } //私有初始化窗口 // 以下方法为公有静态成员,返回唯一实例。 synchronized public static LoadBalancer getInstance(){ if(instance==null){ instance= new LoadBalancer(); } return instance; } } * 负载均衡器的设计 ----饿汉式单例与懒汉式单例的讨论 对上述懒汉式单例类设计的评价: 每次调用getInstance()方法时都需要进行线程锁定判断(占用一段时间),在多线程高并发访问环境中,将会导致系统性能大大降低。 继续改造如下:无需对整个getInstance()方法进行锁定,只需要锁定代码“instance= new LoadBalancer(); ”即可。 // 以下方法为公有静态成员,返回唯一实例。 public static LoadBalancer getInstance(){ if(instance==null){ synchronized ( LoadBalancer.class){ instance= new LoadBalancer(); } } return instance; } * 负载均衡器的设计 ----饿汉式单例与懒汉式单例的讨论 对上页懒汉式单例类设计的评价: 问题貌似得以解决,但事实并非如此。如果使用以上代码来创建单例对象,还是会存在单例对象不唯一,为什么? 假设线程A和线程B 都在调用getInstance()方法,此时Instance对象为 null,均能通过“instance==null”的判断,由于实现了synchronized加锁机制,线程A 进入锁定的代码中创建实例,线程B处于排队等待状态。当线程A执行完毕后,线程B并不知道实例已经创建(已经提前判断过了,此时此处只等创建对象!),导致产生多个实例对象。 因此需要进一步改进。 * 负载均衡器的设计 ----饿汉式单例与懒汉式单例的讨论 继续改造如下:在synchronized锁定代码中再进行一次“instance==null”判断,这种方式成为“双重检查锁定(Double-Check Locking)”,示例代码如下: public c

文档评论(0)

kfcel5889 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档