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

漫画网站开发源码建站公司用哪家服务器

漫画网站开发源码,建站公司用哪家服务器,网站添加flash,任丘市做网站目录 前言 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.yayakq.cn/news/312347/

相关文章:

  • 怎么做刷会员的网站免费的网站软件正能量推荐
  • 企业网站轮播图怎么做网站开发需要后台吗
  • 自定义导航网站 源码网站建设的成本
  • 想做一个部门的网站怎么做施工企业怎样报考a证
  • 浙江二建建设集团有限公司网站网络营销策划是指
  • 诏安县城乡建设局网站网站建设与网站管理
  • 农业信息网站建设概念百度一下电脑版首页网址
  • 哪个网站做视频收益高郑州建设银行网点地址查询
  • 山东外贸网站是什么意思wampserver 架设wordpress 主题错误
  • 做网站协调建设电子商务网站背景
  • 镇平县两学一做网站lnmp一键包wordpress
  • 深圳市手机网站建设品牌wordpress优惠券发放插件
  • 大学校园网站模板图片wordpress官方的三个主题好排名
  • 网站管理端怎么做上海网站建设百度推广公司哪家好
  • 诺基亚官方网站大站网站建设
  • 涂料厂做网站有用吗程序开发的步骤
  • sql网站发布流程俄罗斯乌克兰为什么打仗
  • 建立网站ftp是什么苏州平台公司
  • 在线代理浏览网站网盘 商业网站建设案例课程 下载
  • 网站注册实名制怎么做微信小程序开发者平台官网
  • 网站开发常用插件广州建筑公司招聘网站
  • 北京网站开发哪家专业网站问责建设书
  • 温岭建设公司网站google关键词规划师
  • 官网网站页面设计企业管理咨询有限公司经营范围
  • 温州网站优化页面响应式网站 手机版
  • 网站建设一般用什么编程做彩票网站犯法吗
  • wordpress建站专家cdn网站
  • 网站建设收获与不足贵阳市城乡建设部网站
  • 请简述网站建设的一般流程网站建设项目补充协议
  • 许昌网站建设公司怎么评判一个网站做的好与坏