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

嘉兴网站建设品牌升级信息化建设 网站

嘉兴网站建设品牌升级,信息化建设 网站,重庆网站推广服务,网站建设及安全管理目录 一、什么是单例模式 二、饿汉模式 三、懒汉模式 一、什么是单例模式 单例模式是Java中的设计模式之一#xff0c;能够保证某个类在程序中只存在唯一一份实例#xff0c;而不会创建出多个实例 单例模式有很多实现方式#xff0c;最常见的是饿汉和懒汉两种模式 二、…目录 一、什么是单例模式 二、饿汉模式 三、懒汉模式 一、什么是单例模式 单例模式是Java中的设计模式之一能够保证某个类在程序中只存在唯一一份实例而不会创建出多个实例 单例模式有很多实现方式最常见的是饿汉和懒汉两种模式 二、饿汉模式 饿汉模式在类加载时就创建实例 如何实现饿汉式单例模式 1. 在类中完成实例的初始化在创建的类中创建唯一实例 2. 对外提供获取该唯一实例的方法提供访问该实例的全局静态方法getInstance()来获取该类的唯一实例 3. 构造方法私有化保证类外部不能实例化只有在类中创建的唯一实例 //饿汉式单例模式 public class HungrySingLeton {//在类中创建唯一实例private static final HungrySingLeton instance new HungrySingLeton();//构造方法私有化保证类外部不能进行实例化private HungrySingLeton(){}//对外提供获取该唯一实例的方法public static HungrySingLeton getInstance(){return instance;} } 饿汉式单例模式线程安全吗 饿汉式单例模式在类加载时就进行初始化创建唯一实例。它在线程还没出现之前就实例化了外部只能通过getInstance()方法来获取唯一实例相当于“读操作”因此是线程安全的 饿汉式单例模式的缺点 在类加载时就创建实例并一直在内存中若不使用该实例该实例仍然存在此时存在内存浪费问题 三、懒汉模式 类加载时不创建实例直到第一次使用的时候才创建实例 如何实现懒汉模式 懒汉模式的实现与饿汉模式类似唯一的区别是懒汉模式直到第一次使用的时候才会创建实例 1. 在类中创建唯一实例并将该实例的初始值设为null 2. 对外提供获取该唯一实例的方法若是第一次使用该方法则创建实例 3.  构造方法私有化保证类外部不能实例化只有在类中创建的唯一实例 public class LazySingleton {//在类中创建唯一实例,并将其置为nullprivate static LazySingleton instance null;//构造方法私有化保证类外部不能进行实例化private LazySingleton(){}//对外提供获取该唯一实例的方法public static LazySingleton getInstance(){//若是第一次使用该方法则初始化instanceif (instance null){instance new LazySingleton();}return instance;}}懒汉模式线程安全吗 在多线程情况下可能会出现创建多个实例的情况 如何解决线程安全问题 通过加锁来解决线程安全问题 将判断instance是否为空和创建实例两个操作加上锁或是直接在方法上加上synchronized从而保证在上图的情况下也只创建一个实例 public static LazySingleton getInstance(){synchronized (LazySingleton.class){//若是第一次使用该方法则初始化instanceif (instance null){instance new LazySingleton();}}return instance;} 或 public synchronized static LazySingleton getInstance(){//若是第一次使用该方法则初始化instanceif (instance null){instance new LazySingleton();}return instance;} 此时 由于加锁和解锁开销较高而懒汉式单例模式仅在第一次调用时才会存在可能创建多个实例的问题在后面调用getInstance()方法时判断instance不为空直接返回instance而在加锁后无论是否已经存在实例在多线程情况下都会发生阻塞此时存在执行效率低的问题 因此在加锁前判断是否已经创建实例若已经创建实例则直接返回instance若未创建实例则进行加锁操作 public static LazySingleton getInstance(){//判断是否已经创建实例若已经创建实例则不加锁直接返回instanceif(instance null){//若实例未创建则向下执行来竞争锁//竞争成功的锁进行创建实例操作synchronized (LazySingleton.class){//在竞争成功的锁创建实例并释放锁后//其他竞争到锁的线程被内层if挡住不会创建多个实例if (instance null){instance new LazySingleton();}}}return instance;} 通过两个if条件判断降低了锁竞争的频率既保证了线程安全又提高了执行效率 此时线程安全了吗 此时指令重排序也可能引起线程安全问题 指令重排序是编译器优化的一种方式通过调整原有代码的执行顺序在保证逻辑不变的前提下提高程序的效率 在创建实例时可将其分为三个步骤 1. 申请一段内存空间 2. 在该内存空间上调用构造方法创建出实例 3. 将该内存地址赋值给instance引用变量 正常情况下创建实例是按照1 2 3的顺序来执行的而编译器也可能会将其优化为1 3 2的顺序来执行 而当按照1 3 2 的方式来创建实例时就可能会出现问题 如何解决指令重排序带来的线程安全问题 使用volatile  volatile能够禁止指令重排序从而保证创建实例时按照1 2 3的顺序来创建出实例保证创建出初始化的实例 public class LazySingleton {//在类中创建唯一实例,并将其置为null//volatile:禁止指令重排序private volatile static LazySingleton instance null;//构造方法私有化保证类外部不能进行实例化private LazySingleton() {}//对外提供获取该唯一实例的方法public static LazySingleton getInstance() {//判断是否已经创建实例若已经创建实例则不加锁直接返回instanceif (instance null) {//若实例未创建则向下执行来竞争锁//竞争成功的锁进行创建实例操作synchronized (LazySingleton.class) {//在竞争成功的锁创建实例并释放锁后//其他竞争到锁的线程被内层if挡住不会创建多个实例if (instance null) {instance new LazySingleton();}}}return instance;} }懒汉模式在类加载时并没有进行实例化而是在第一次调用getInstance()方法的时候才进行实例化。若一直没有调用getInstance()方法则不创建该唯一实例此时节省了实例化的开销
http://www.hkea.cn/news/14547690/

相关文章:

  • 廊坊网站关键词优化网站优化怎么做ppt
  • 重庆城乡建设部网站首页上海市住房和城乡建设厅网站首页
  • 公司装修费会计分录seo外包公司多吗
  • 做植物网站全网营销推广系统
  • html5网站建设源码简单flash网站模板
  • 云南最便宜的网站建设小学全部课程免费教学软件
  • 厦门正规网站建设多少本网站维护升级
  • 十大外贸网站网站各类备案
  • 网站开发兼职群德州网站建设设计
  • 深圳网站建设..wordpress wp posts
  • 三网合一网站程序网站建设价值
  • 网站推广淘宝联盟怎么做免费外贸网站模板
  • wordpress流量站设计师证
  • 营销型网站建设 价格杏坛网站设计
  • 高端大气网站源码seo推广策划
  • 衡水建站公司用ps个人网站怎么做
  • 建设电子商务网站的好处网站建设企业网站优化
  • 怎嘛做网站受欢迎的常州做网站
  • 小米路由器3 做网站为网站网站做代理被判缓刑
  • 英文网站建设哪家强品牌建设标准
  • 广州网站推广制作网站建设课程设计实训心得
  • 网站备案 选项杭州做网站 做小程序
  • 网页设计与网站建设+pdf上海歌舞娱乐场所停业
  • 电子商务网站开发方式网站设计顺德
  • 成都建立公司网站域名备案查询站长之家
  • 网站建设加盟培训怎样做一个网页
  • 网站建设专业知识应用常熟做网站公司
  • 合肥公司门户网站制作网站开发技术简介dw
  • 阿里巴巴国际站运营培训专业网站是指什么
  • 静态网站开发课程网企业网站的制作公司