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

网站建设服务器的选择方案超能搜索引擎系统网站

网站建设服务器的选择方案,超能搜索引擎系统网站,成品网站w灬源码伊甸院,抖音小程序入口在哪里目录 前言 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.15wanjia.com/news/30871.html

相关文章:

  • 网站管理公司百度seo服务
  • 最近国语视频在线观看免费播放北京seo服务销售
  • 网站开发人员工作内容广州网站营销优化qq
  • 医疗软件网站建设公司排名软文世界
  • 建设信用卡网站是什么seo搜索优化
  • web做网站游戏推广赚钱
  • 极简风格的网站app推广是什么意思
  • 长沙建设网站企业百度app推广方法
  • 咸宁网站建设公司线下推广方式有哪些
  • 高端网站建设公司哪家服务好网站查询seo
  • 南城网站建设公司咨询营销型网站建设ppt
  • 出口退税在哪个网站做网络广告电话
  • 平面设计软件ps网站的推广优化
  • 当今做那些网站能致富今年疫情最新消息
  • 做招商类型的网站媒体:北京不再公布疫情数据
  • 提供微网站制作电话怎么免费做网站
  • h5网站建设是什么意思百度快速收录开通
  • 吉林市网站建设公司湖南长沙最新情况
  • 一个空间如何做多个网站seo是什么意思啊
  • 做网站开发使用百分比的好处html期末大作业个人网站制作
  • 盐山做网站seo优化技术招聘
  • 期刊类网站建设网址查询地址查询
  • 焦作网站建设哪家好企业管理软件
  • 做网站比较好百度指数在线查询小程序
  • 网站推广技术哪家好青岛关键词推广seo
  • 做网站空间哪个好seo中文意思是
  • 青少年心理建设网站今日头条最新消息
  • 小程序开发公司哪家济南seo小黑seo
  • 长宁区网站建设网站制用html制作个人网页
  • 手机网站需要什么百度里面的站长工具怎么取消