当前位置: 首页 > news >正文

网站建设服务器的选择方案专业营销推广团队

网站建设服务器的选择方案,专业营销推广团队,asa8.4 做网站映射,河南省网站建设目录 前言 1.饿汉式 2.懒汉式 3.双重检测 4.静态内部类 5.枚举 总结: 前言 单例模式是我们日常开发过程中,遇到的最多的一种设计模式。通过这篇文章主要分享是实现单例的几种实现方式。 1.饿汉式 饿汉式的实现方式比较简单。在类加载的时候&#…

目录

前言

 1.饿汉式

2.懒汉式

3.双重检测 

 4.静态内部类

5.枚举

总结:


前言

单例模式是我们日常开发过程中,遇到的最多的一种设计模式。通过这篇文章主要分享是实现单例的几种实现方式。


 1.饿汉式

        饿汉式的实现方式比较简单。在类加载的时候,instance 静态实例就已经创建并初始化好了,所以,instance 实例的创建过程是线程安全的。不过,这样的实现方式不支持延迟加载(,从名字中我们也可以看出这一点。具体的代码实现如下所示:


public class IdGenerator { private AtomicLong id = new AtomicLong(0);private static final IdGenerator instance = new IdGenerator();private IdGenerator() {}public static IdGenerator getInstance() {return instance;}public long getId() { return id.incrementAndGet();}
}

2.懒汉式

懒汉式相对于饿汉式的优势是支持延迟加载。具体的代码实现如下所示:


public class IdGenerator { private AtomicLong id = new AtomicLong(0);private static IdGenerator instance;private IdGenerator() {}public static synchronized IdGenerator getInstance() {if (instance == null) {instance = new IdGenerator();}return instance;}public long getId() { return id.incrementAndGet();}
}

懒汉式的缺点也很明显,我们给 getInstance() 这个方法加了一把大锁(synchronzed),导致这个函数的并发度很低。量化一下的话,并发度是 1,也就相当于串行操作了。而这个函数是在单例使用期间,一直会被调用。如果这个单例类偶尔会被用到,那这种实现方式还可以接受。但是,如果频繁地用到,那频繁加锁、释放锁及并发度低等问题,会导致性能瓶颈,这种实现方式就不可取了。

3.双重检测 

 饿汉式不支持延迟加载,懒汉式有性能问题,不支持高并发。那我们再来看一种既支持延迟加载、又支持高并发的单例实现方式,也就是双重检测实现方式。在这种实现方式中,只要 instance 被创建之后,即便再调用 getInstance() 函数也不会再进入到加锁逻辑中了。所以,这种实现方式解决了懒汉式并发度低的问题。具体的代码实现如下所示:

 


public class IdGenerator { private AtomicLong id = new AtomicLong(0);private static IdGenerator instance;private IdGenerator() {}public static IdGenerator getInstance() {if (instance == null) {synchronized(IdGenerator.class) { // 此处为类级别的锁if (instance == null) {instance = new IdGenerator();}}}return instance;}public long getId() { return id.incrementAndGet();}
}

         实际上,上述实现方式存在问题:CPU 指令重排序可能导致在 IdGenerator 类的对象被关键字 new 创建并赋值给 instance 之后,还没来得及初始化(执行构造函数中的代码逻辑),就被另一个线程使用了。这样,另一个线程就使用了一个没有完整初始化的 IdGenerator 类的对象。要解决这个问题,我们只需要给 instance 成员变量添加 volatile 关键字来禁止指令重排序即可。

 4.静态内部类

 我们再来看一种比双重检测更加简单的实现方法,那就是利用 Java 的静态内部类。它有点类似饿汉式,但又能做到了延迟加载。具体是怎么做到的呢?我们先来看它的代码实现


public class IdGenerator { private AtomicLong id = new AtomicLong(0);private IdGenerator() {}private static class SingletonHolder{private static final IdGenerator instance = new IdGenerator();}public static IdGenerator getInstance() {return SingletonHolder.instance;}public long getId() { return id.incrementAndGet();}
}

SingletonHolder 是一个静态内部类,当外部类 IdGenerator 被加载的时候,并不会创建 SingletonHolder 实例对象。只有当调用 getInstance() 方法时,SingletonHolder 才会被加载,这个时候才会创建 instance。instance 的唯一性、创建过程的线程安全性,都由 JVM 来保证。所以,这种实现方法既保证了线程安全,又能做到延迟加载。

5.枚举

 我们介绍一种最简单的实现方式,基于枚举类型的单例实现。这种实现方式通过 Java 枚举类型本身的特性,保证了实例创建的线程安全性和实例的唯一性。具体的代码如下所示:


public enum IdGenerator {INSTANCE;private AtomicLong id = new AtomicLong(0);public long getId() { return id.incrementAndGet();}
}

总结:

在日常的工作中使用枚举类的方式创建单例是最安全的。

枚举可避免被反序列化破坏单例。原因:枚举对象的序列化、反序列化有自己的一套机制:序列化时,仅仅是将枚举对象的name属性输出到结果中,反序列化的时候则是通过java.lang.Enum的valueOf()方法来根据名字查找枚举对象。

推荐大家使用枚举的方式创建单例。

http://www.mmbaike.com/news/100865.html

相关文章:

  • asp php jsp网站开发营销技巧培训ppt
  • wordpress建站欣赏seo优化师培训
  • 怎么盗号网站怎么做网站标题算关键词优化吗
  • 用php做电子商务网站南京seo招聘
  • wordpress建站 app访问搜索推广渠道有哪些
  • 省级示范校建设专题网站网络广告形式
  • 哪些网站是用php开发的seo俱乐部
  • 鹰潭网站制作seo排名优化培训怎样
  • 郑州网站高端网站设计快抖霸屏乐云seo
  • 手机网站建设批发排名第一的助勃药
  • 做美妆网站的关键词seo站长论坛
  • 如果是自已建设的网站_那你在数据库想改成什么时间都可以.青柠影院免费观看电视剧高清
  • 深圳网站建设便捷seo建站还有市场吗
  • 长垣做网站淘宝美工培训
  • 做网站的前提口碑营销策略有哪些
  • 北京网站建设hj华网天下2022年关键词排名
  • 网页与网站的区别与联系软文推广媒体
  • 广州网站建立珠海网站建设制作
  • 购买域名做销售网站可以吗win7优化工具哪个好用
  • 重庆专门做网站的公司电子商务营销模式有哪些
  • 重庆网站制作公司广告推广策划
  • 网站浏览器网站维护需要多长时间
  • 国内做游戏破解的网站网站建设的六个步骤
  • 网站运营工作计划南京seo新浪
  • iis发布php网站浏览器下载
  • 找人做网站需求怎么写深圳网络营销平台
  • 网站显示正在建设是什么意思北京seo公司哪家好
  • 武汉光谷律师北京seo公司华网白帽
  • 免费1级做爰网站如何做网络销售产品
  • 企业名称预先核准通知书搜索引擎优化与关键词的关系