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

西安网站建设外包河南省商丘网站

西安网站建设外包,河南省商丘网站,wordpress 产品模块,wordpress边栏固定文章目录 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.dnsts.com.cn/news/3686.html

相关文章:

  • 网站开发从入门到实战wordpress cx udy
  • 广州设计网站wordpress分类目录前缀
  • wordpress建站教程百科怎么找上海网站建
  • 杭州模板网站龙采做网站要多少钱
  • 标书制作教程赣州优化
  • 哪个网站做外贸的网站交易截图可以做证据吗
  • 北京网站优化指导找我家是做的视频网站
  • 宁夏企业网站建设深圳做手机网站设计
  • 网站建设评价最专业网站建设开发
  • wordpress做出的网站江苏省张家港保税区建设厅网站
  • django做网站和js做网站自己上传图片做动漫图网站
  • 互联网做网站怎么赚钱青岛建站平台
  • oem网站建设源码品牌建设的步骤
  • WordPress多站點支付插件设计外贸网站
  • 游戏推广合作安徽seo网络优化师
  • 做网站有免费的服务器吗天猫网页版
  • 网站开发手机编译器wordpress插件漏洞扫描
  • 淘宝客如何做返积分制网站怎样做网络推广方法
  • 临沂培训学校网站建设网站建设数据技术
  • 中国域名门户网站专业的wap网站开发
  • 网站模板带后台网络设计工作
  • 可以做外贸的网站广州网站建设 骏域
  • 做搜狗手机网站点击软张家界市建设网站
  • Wordpress垂直类目站模版wordpress和百度指数
  • 网站seo推广员招聘WordPress校园博客
  • 养老网站建设 中企动力网站分类有哪几类
  • 开发网站嵌入广告视频网站怎么做可以播放电视剧
  • 网站开发合同履约做外贸如何访问国外网站
  • 网站开发实例社区网页设计实训总结200
  • 辽河油田建设有限公司网站wordpress文章页全白