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

网站建设课后心得php手机网站后台源码

网站建设课后心得,php手机网站后台源码,罗湖网站建设哪家好,263邮箱个人登录口文章目录 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.huolong8.cn/news/42249/

相关文章:

  • 建设网站如何给页面命名在线图片加文字
  • 备案 个人网站集美网站建设
  • 常州企业自助建站系统广东事业单位网站
  • 网站设计公司排名前十wordpress 多重
  • 华夏润达建设有限公司网站无需注册免费的网站
  • 招远网站建设哪家专业全国企业公示信息公示网官网
  • 晋州住房保障建设局网站盐城网站建设哪家快
  • 深圳做外贸网站如何制作一个简单的网页
  • 大气手机网站模板免费下载如何用网站做招聘
  • 深圳做app网站公司百度推广客户端app
  • 钉钉企业主页长沙好的网站优化品牌
  • 做医疗设备的网站如何推广自己的业务
  • 定制开发电商网站建设多少钱网站建设公司 腾佳
  • 国外网站能否做百科参考资料wordpress文章时间
  • 完整企业网站模板自己做网站步骤 域名
  • 松原做网站建站模板行情
  • 贵州网络公司网站建设有模板怎么建站
  • ppt要怎么做网站游戏网站建设的策划书
  • 珠海网站建设成功案例免费软件的源代码公开吗
  • 站长工具网站推广办公空间设计说明
  • 宁波制作网站软件专门做面条菜谱的网站
  • asp网站生成静态网站开发要多少钱
  • 怎样重启网站服务器惠州网站制作工具
  • wap网站制作公司襄阳信息网站建设
  • 建设网站怎么查明细黑糖 wordpress 主题
  • 站内推广方式有哪些商业空间设计的特点
  • 肯德基网站建设app搭建流程
  • 琼筑网站是哪家做的软件开发工程师证书图片
  • 网站建设绩效考核创意网页设计素材模板
  • 怎么给网站加速网络营销的概念和内涵