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

苏州全网网站建设济南网站建设加q479185700

苏州全网网站建设,济南网站建设加q479185700,网站流量排名查询,用wordpress建公司网站步骤目录 一、单例模式概述 二、“饿汉模式”实现单例模式 三、“懒汉模式”实现单例模式 3.1 单线程下的“懒汉模式” 3.2 多线程下的“懒汉模式” 一、单例模式概述 1#xff09;什么是单例模式#xff1f; 单例模式是一种设计模式。 单例模式可以保证某个类在程序中只存…目录 一、单例模式概述 二、“饿汉模式”实现单例模式 三、“懒汉模式”实现单例模式 3.1 单线程下的“懒汉模式” 3.2 多线程下的“懒汉模式” 一、单例模式概述 1什么是单例模式 单例模式是一种设计模式。 单例模式可以保证某个类在程序中只存在唯一实例即不允许创建多份实例。 使用单例模式上述要求就得到了检查和校验。 2单例模式的实现形式 单例模式可以通过很多种方法实现“饿汉模式”和“懒汉模式”是其中最基础的两种本文只介绍这两种实现。 二、“饿汉模式”实现单例模式 通过代码演示“饿汉模式”实现的单例模式 class Singleton{//新建一个唯一实例private static Singleton instance new Singleton();//方法返回唯一实例public static Singleton getInstance() {return instance;}//将构造方法私有化private Singleton() { } } 1上述代码做了什么 创建了一个被 static 修饰的实例这个实例成为了类属性。类对象只会有一个这个类属性也只会有一个。 私有化构造方法外部无法 new 新的实例只能通过 get 方法获取唯一的那一个 instance。 2为什么叫做“饿汉模式” 上述代码中实例是类属性。类属性在类加载的时候就创建了创建时机早十分“迫切”因此称为“饿汉模式”。 代码证明“饿汉模式”返回的实例是唯一的 public class Singleton_Demo0 {public static void main(String[] args) {//想直接new对象就会报错//Singleton instance new Singleton();//两次调用getInstance()方法并分别赋值Singleton instance1 Singleton.getInstance();Singleton instance2 Singleton.getInstance();//对比两个变量发现是同一实例if(instance1 instance2){System.out.println(两个对象是同一个对象);}} }//运行结果 两个对象是同一个实例 3“饿汉模式”的单例模式在多线程下是线程安全的吗 上述代码中get 方法返回的是已经创建好的实例这个操作本质上只是一个“读操作”多个线程读取同一个变量并不会造成线程不安全。 因此“饿汉模式”的单例模式在多线程下是线程安全的。 三、“懒汉模式”实现单例模式 3.1 单线程下的“懒汉模式” 通过代码演示“懒汉模式”实现的单例模式 class Singleton{//声明一个变量作为类属性private static Singleton instance null;//判断变量是否为null是则创建实例后返回否则返回public static Singleton getInstance() {if(instance null){instance new Singleton();}return instance;}//将构造方法私有化private Singleton() { } } 1上述代码做了什么 声明了一个类属性。类对象只会有一个这个类属性也只会有一个。 私有化构造方法外部无法 new 新的实例只能通过 get 方法获取唯一的那一个 instance。get 方法中根据变量是否为 null 判断是否应该创建实例。 2为什么叫做“懒汉模式” 上述代码中实例是在程序员第一次调用 get 方法后才创建的创建时机较晚或者根本不用创建因此称为“懒汉模式”。 3.2 多线程下的“懒汉模式” 1单线程下的“懒汉模式”在多线程下是线程安全的吗 答案是否定的单线程下的“懒汉模式”在多线程下是线程不安全的我们可以从以下两个方面分析 “原子性” 上述代码中判断变量是否为空的代码 —— if(instance null)和实例化代码 ——  instance new Singleton()并非是“原子”的。在多线程环境下这就可能导致线程不安全。 可以使用 synchronized 关键字将这两句代码加锁解决这个问题。 内存可见性和指令重排序 因为 instance 是一个被 static 修饰的共享数据而且编译器内部可能对实例化的代码 —— new Singleton()进行了编译器优化。 这就无法保证内存的可见性和指令的顺序执行因此在多线程环境下可能导致线程不安全。 可以使用 volatile 关键字对共享数据 instance 进行修饰解决这个问题。 使用以上两个关键字的原因和方式详细请参考以下博客 阅读指针 - 《synchronized 关键字 和 volatile 关键字》JavaEE synchronized关键字和锁机制 -- 锁的特点、锁的使用、锁竞争和死锁、死锁的解决方法-CSDN博客文章浏览阅读70次。介绍了 synchronized 关键字 和 锁机制其中重点介绍了锁的特点、使用方法和死锁的相关内容。https://blog.csdn.net/zzy734437202/article/details/134742168JavaEE volatile关键字 -- 保证内存可见性、禁止指令重排序-CSDN博客文章浏览阅读59次。简单介绍什么是内存可见性和指令重排序。volatile关键字可以将这两种编译器优化强制关闭。https://blog.csdn.net/zzy734437202/article/details/134757070 2“懒汉模式”在多线程下应该怎么编写 根据上述分析根据单线程模式下的“懒汉模式”进行改进。 方法如下 增加 volatile 关键字对共享数据进行修饰。 为判断是否为 null 和 实例化的代码加锁使这两句代码称为“原子”。 增加 volatile 关键字对共享数据进行修饰 private volatile static Singleton instance null; 为判断是否为 null 和 实例化的代码加锁使这两句代码称为“原子” public static Singleton getInstance() {synchronized (locker){if(instance null){instance new Singleton();}}return instance;} 3“双重校验锁” 我们再仔细分析一下上述的 get 方法。 假设程序需要多次调用这个 get 方法那么每一次进入都会进行加锁加锁是会增加系统开销的。 那么是否真的有必要每次都加锁呢 当 get 方法被第一次调用实例就会被创建那么后续再调用这个 get 方法时返回实例就好了加锁部分的代码块完全可以不用执行。 在加锁的代码块之外再增加一个if(instance null)进行判断那么实例在被创建之后也就不会再进入加锁的代码块中了。 我们成功利用“双重校验锁”优化了程序。 代码演示“双重校验锁”优化后的 get 方法 public static Singleton getInstance() {//这个if用于判断是否需要加锁if(instance null){synchronized (locker){//这个if用于判断是否需要新建实例if(instance null){instance new Singleton();}}}return instance;} 经过以上的完善和优化我们终于可以写出在多线程下保证线程安全的“懒汉模式”单例模式了 class Singleton{//声明一个变量作为类属性private volatile static Singleton instance null;private static final Object locker new Object();//判断变量是否为null是则创建实例后返回否则返回public static Singleton getInstance() {//这个if用于判断是否需要加锁if(instance null){synchronized (locker){//这个if用于判断是否需要新建实例if(instance null){instance new Singleton();}}}return instance;}//将构造方法私有化private Singleton() { } } 阅读指针 - 《经典设计模式之 -- 使用阻塞队列实现“生产者-消费者模型”》 JavaEE 经典设计模式之 -- 使用阻塞队列实现“生产者-消费者模型”-CSDN博客自己实现了的阻塞队列介绍了经典的设计模式“生产者-消费者模型”。https://blog.csdn.net/zzy734437202/article/details/134807241
http://www.pierceye.com/news/203403/

相关文章:

  • 溧阳城乡建设厅网站惠州专业网站建设
  • app嵌入手机网站dw旅游网站怎么做
  • wpf做网站烟台做网站工资
  • 做网站公司名字网站建设方案对比分析报告
  • 网站360优化网站开发所需技术
  • 宁河做网站公司wordpress漏洞扫描工具
  • 单位网站建设的目的手机可以做网站服务器吗
  • 上海网站建设有限公司lnmp安装wordpress限权
  • 大航母网站建设服务php一般网站空间多大
  • 中性衣服印花图案设计网站做网站的工作
  • 只做女性的网站编程入门先学什么软件
  • 创客网站建设新余公司做网站
  • 买个网站域名多少钱网站建设 内容缺乏
  • 清河做网站哪里好建设一个网站的文案需要
  • 农机网站模版建网站用什么工作站
  • 网站可以做无形资产游戏代理0加盟费
  • 高端网站建设哪家公司好城乡建设部网站甘红刚
  • 湖北省建设部网站网站排名seo教程
  • 郑州 高端网站建设网络结构有哪几种
  • 电脑做apk的网站h5工商网站如何做实名
  • 循化网站建设公司c语言开发工具
  • wordpress网站做app关于网站的ppt怎么做
  • 怎么建设商品网站项目计划书范文
  • 大足建网站的网页微信版官方下载
  • 企业网站免费建设做网站设计需求
  • 做电影网站用什么虚拟主机建设网站模块需要哪些内容
  • 基于asp.net网站开发优化企业网站
  • 做网站有了空间在备案吗网站建设实务课本
  • 个人站长和企业网站wordpress主键外键
  • 关于对网站建设情况的通报东南亚跨境电商有哪些平台