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

西安网站建设外包长春网站建设模板制作

西安网站建设外包,长春网站建设模板制作,找模板,免费企业宣传片制作软件文章目录 1、背景2、单例模式3、代码实现1、第一种实现#xff08;饿汉式#xff09;为什么属性都是static的#xff1f;2、第二种实现#xff08;懒汉式#xff0c;线程不安全#xff09;3、第三种实现#xff08;懒汉式#xff0c;线程安全#xff09;4、第四种实现… 文章目录 1、背景2、单例模式3、代码实现1、第一种实现饿汉式为什么属性都是static的2、第二种实现懒汉式线程不安全3、第三种实现懒汉式线程安全4、第四种实现懒汉式双重校验锁DCLgetSingleton里为什么会有两个if判空singleton为什么被volatile修饰 1、背景 在软件开发中经常需要某些类只能有唯一的实例比如数据库连接。如何才能保证整个应用中只有一个唯一实例如果靠人为制定的协定来约束显然不能很好的保证这一点。如果要从语法上约束在面向对象里面什么地方能够约束实例的创建 显然只有构造函数与类实例的创建相关。那么如何才能让构造函数阻止类实例的创建使其只有一个唯一实例让构造函数的修饰为私有 2、单例模式 单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制“阻止”所有想要生成对象的访问。 3、代码实现 1、第一种实现饿汉式 public class Singleton { private static Singleton instance new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } } 饿汉式在类加载时已经创建好该对象在程序调用时直接返回该单例对象即可。类在加载时会在JVM的堆内存中创建一个Singleton对象当类被卸载时Singleton对象也随之消亡了(没有被引用)。 它基于 classloader 机制避免了多线程的同步问题不过instance 在类装载时就实例化虽然导致类装载的原因有很多种在单例模式中大多数都是调用 getInstance 方法 但是也不能确定有其他的方式或者其他的静态方法导致类装载这时候初始化 instance 显然没有达到 lazy loading 的效果。 为什么属性都是static的 为了使其只有一个唯一实例我们将无参构造方法设置成静态的其他的类就没有办法直接通过new来构建该类的对象。无法通过new来构建类对象那就只能通过调用类的静态方法getInstance这个唯一进出口来获得对象。由于静态方法里只能使用静态static属性所以instance被修饰为静态的static。 2、第二种实现懒汉式线程不安全 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance null) { instance new Singleton(); } return instance; } } 这种方式是最基本的实现方式这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized所以严格意义上它并不算单例模式。这种方式 lazy loading 很明显不要求线程安全在多线程不能正常工作。 为什么不支持多线程 假如现在有两个线程一个线程a一个线程b线程a被操作系统选中分配时间片去调用Singleton.getInstance()判断instance null为true进入代码块然后时间片用完切换到线程b执行线程b也调用Singleton.getInstance()当运行到instancenull时因为线程a上次判断完instance为null就结束了所以此时instance还是null于是线程b执行instancenew Singleton()并返回instance。线程b时间片用完让出cpu线程a被选中从instancenew Singleton开始执行 于是又在堆中创建了一个Singleton对象实例并返回。所以严格意义上说它并不算单例模式。 3、第三种实现懒汉式线程安全 public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance(){ if (instance null) { instance new Singleton(); } return instance; } } 这样就规避了两个线程同时创建Singleton对象的风险但是引来另外一个问题每次去获取对象都需要先获取锁并发性能非常地差极端情况下可能会出现卡顿现象。因为在getInstance方法上加了synchronized锁调用该方法的线程需要排队调用。一个线程获得了Singleton类锁后在该线程执行完getInstance()方法前其他线程要么阻塞要么自旋无法执行getInstance方法 4、第四种实现懒汉式双重校验锁DCL public class Singleton { private volatile static Singleton singleton; //1private Singleton (){} //2public static Singleton getSingleton() { //3 if (singleton null) { //4synchronized (Singleton.class) { //5 if (singleton null) { //6singleton new Singleton(); //7 } } } return singleton; } }第四种实现对于第三种实现进行了优化如果没有实例化对象则加锁创建如果已经实例化了则不需要加锁直接获取实例这种优化提高了高并发下的性能。 getSingleton里为什么会有两个if判空 假设现在有3个线程线程A、线程B、线程C。线程A执行第一个if判断为空后时间片用完让出cpu切换线程。线程B执行第一个if判断为空后加锁加锁后恰好时间片用完让出cpu。切换到线程C ,判断完第一个if后因为B没有释放锁等待时间片结束cpu空转切换线程。当再次切换到线程B后进入同步代码块先判断singleton是不是null是null创建对象释放锁返回对象。当执行完第一个if判断后阻塞在加锁的线程 抢到锁后继续执行剩下的代码在第二个if判断时因为第一个线程已经创建了对象则跳过退出同步代码块释放锁得到线程B创建的实例对象。后面再来的线程在第一个if判断返回false后直接返回线程B创建好的实例对象。 由此可见第一个if是为了验证是否已经创建了对象该判断是为了避免不必要的同步,第二个if是为了避免重复创建单例是给第二个以及后面持有锁的线程准备的。 singleton为什么被volatile修饰 什么是指令重排序JVM在保证最终结果正确的情况下可以不按照程序编码的顺序执行语句尽可能提高程序的性能。 new对象操作在指令层面不是一个原子操作分为三步 为singleton分配内存空间Msingleton初始化将singleton指向分配好的内存空间M 在执行new操作时2、3步可能发生指令重排会发生下面这种情况申请空间后存入地址但singleton对象还未初始化切换线程。当新来的线程进行第一个if判断时因为方法区中singleton里面是有堆中地址的判断不为null当return时因为申请的空间中没有数据则报空指针异常。 如下图 使用volatile关键字可以防止指令重排序。使用volatile关键字修饰的变量可以保证其指令执行的顺序与程序指明的顺序一致不会发生顺序变换。使用volatile关键字修饰的变量可以保证其内存可见性即每一时刻线程读取到该变量的值都是内存中最新的那个值线程每次操作该变量都需要先读取该变量。 我在这里对堆、方法区、Java虚拟机栈进行了详解
http://www.hkea.cn/news/14357521/

相关文章:

  • 最炫的网站期货直播室网站建设
  • 中国旅游网站排名天津seo数据监控
  • 做视频网站需要多大空间网站不绑定域名解析
  • 专题网站建设策划方案网站建设策略营销
  • 天津网站建设定制东营建设信息网站电话
  • 做网站需要深圳保障性住房和安居房的区别
  • 开网站建设公司好公司名高端大气不重名
  • 嘉兴做网站费用wordpress问卷模板下载
  • 网站宽屏版网站没有百度快照
  • 网站建设前准备工作网站首页图片怎么更换
  • 如何做一个移动网站台州网站建设 推广公司
  • 郑州400建站网站建设购物网站
  • 四川法制建设网站兴仁企业建站公司
  • 国防教育网站建设说明书网站制作商家入驻
  • 珠海专业网站制作公司seo网页推广
  • 外贸零售网站建设做pop网站
  • 图文网站建设樟木头电子网站建设报价
  • 大学网站设计网络营销推广的技巧有哪些
  • 做美食的网站哪个好做面点的网站
  • 做资格核查在哪个网站移动电子商务的概念
  • 网站编辑兼职免费的软件下载安装
  • 公司网站开发招标书电子商务网站建设与管理实务
  • 哪家企业网站建设好建设一个跟京东一样的网站
  • php 快速网站开发简网app工场怎么创app
  • h5网站如何做wordpress 数据库 缓存6
  • 郑州房地产网站建立网站数据库实验报告
  • 做猎头可以在哪些网站注册wordpress 无法安装
  • 郑州专业网站建设价格织梦笑话娱乐网站源码2w数据+36条采集规则
  • 海外网站制作手机app软件下载安装
  • 网站公司成功案例怎么写wordpress定时任务原理