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

浙江省互联网建设网站农业公园网站建设

浙江省互联网建设网站,农业公园网站建设,基层组织建设部 网站,网站首页百度收录怎么做文章目录 一、介绍什么是单例模式二、饿汉模式三、懒汉模式四、讨论两种模式的线程安全问题 一、介绍什么是单例模式 在介绍单例模式之前#xff0c;我们得先明确一个名词设计模式。 所谓设计模式其实不难理解#xff0c;就是在计算机这个圈子中#xff0c;呢些大佬们为了… 文章目录 一、介绍什么是单例模式二、饿汉模式三、懒汉模式四、讨论两种模式的线程安全问题 一、介绍什么是单例模式 在介绍单例模式之前我们得先明确一个名词设计模式。 所谓设计模式其实不难理解就是在计算机这个圈子中呢些大佬们为了防止我们这些资质平平的程序猿不把代码写的太差所设计出的针对一些场景的问题解决方案解决框架。 单例模式就是多个设计模式中的一个。 单例模式逐字来理解就是单个示例对象的意思。 在某些场景中有些特定的类只能创建出一个实例不应该创建多个实例。这样的要求虽然可以通过程序员本人进行控制但是仍然存在不确定性。 使用单例模式后此时只能创建 1 个 实例单例模式就是针对上述的特殊需求的一个强制的保证。 在 Java 中实现单例模式的方法有很多这里介绍一下最常见的两类。 (1) 饿汉模式 (2) 懒汉模式 二、饿汉模式 我们已经知道单例模式就是要让某个类创建出唯一一个对象所谓饿汉字面理解就是一个饿了很久的人这样的人在看到吃的就会异常急切。 这里的饿汉模式就是让代码在一开始执行的时候即就是类加载阶段就去创建这个类的实例这种效果就给人一种 “非常急切” 的感觉。 下面我来展示一下相关的代码示例 //饿汉模式 //保证 Singleton 这个类只能创建一个实例 class Singleton{//在此处先将实例创建出来private static Singleton instance new Singleton();//如果要使用这个唯一实例同意通过 Singleton.getInstance() 方式获取public static Singleton getInstance(){return instance;}//为了避免 Singleton 类被复制多份//将构造方法设置为 private。再类外面无法通过 new 来实现创建 Singleton 实例private Singleton(){} }public class ThreadDemo {public static void main(String[] args) {Singleton s1 Singleton.getInstance();Singleton s2 Singleton.getInstance();System.out.println(s1 s2);} }上面的结果就表明这是同一个实例。 static 在这里的作用(了解 static 关键字作用的可以跳过) static 在这里保证了使用的对象是唯一的下面通过代码示例来解释一下 class Test{public int A;public static int B; }public class StaticTest {public static void main(String[] args) {Test t1 new Test();Test t2 new Test();//设置非 static 修饰的变量t1.A 10;t2.A 20;System.out.println(t1.A的值 t1.A);System.out.println(t2.A的值 t2.A);//设置由 static 修饰的变量t1.B 10;t2.B 20;System.out.println(t1.B的值 t1.B);System.out.println(t2.B的值 t1.B);} }总的来说被 static 修饰的关键字在代码中表现的内容与最后一次设定是一样的这样也就确保了使用对象的唯一性。 三、懒汉模式 对于懒汉模式 “懒汉” 字面意义上不难理解就是表示一个人很懒直到事情迫在眉睫才会去做。 在这里懒汉模式也是同样在类加载之初是不会进行对象的创建一直到第一次真正使用的时候才会去创建。 代码示例 //实现懒汉模式 class SingletonLazy{//这里先将对象不进行创建先设定为 nullprivate static SingletonLazy instance null;public static SingletonLazy getInstance(){//判断是否有对象被创建没有就进行创建if (instance null){instance new SingletonLazy();}return instance;}//将构造方法设定为 static 不能进行 new 来创建private SingletonLazy(){} }public class ThreadDemo21 {public static void main(String[] args) {SingletonLazy s1 SingletonLazy.getInstance();SingletonLazy s2 SingletonLazy.getInstance();System.out.println(s1 s2);} }运行结果 同样的这一样表示了上面运用的是同一个对象。 四、讨论两种模式的线程安全问题 上面的 饿汉模式 和 懒汉模式在多线程的调用下是很有可能存在线程安全问题的。下面我来简单分析一下。 前面我们已经了解了关于线程安全问题的部分知识我们知道计算机中对数据的处理分为1. 从内存 “读”。2.在cpu寄存器上 “改”。3. “写”入内存。这几个操作。在这里我们就根据上面几点来进行解释。 如上图所示我们发现饿汉模式只存在读这个操作操作很单一在这里就没有线程安全问题。懒汉模式存在着读和写两个操作对此如果不进行约束是有可能会出现线程安全问题。如下图所示 呢么如何才能让懒汉模式 线程安全答案是加锁。 class SingletonLazy{//这里先将对象不进行创建先设定为 nullprivate static SingletonLazy instance null;public static SingletonLazy getInstance(){//通过加锁消除线程安全问题在此处加锁才能保证读操作和修改操作是一个整体synchronized (SingletonLazy.class){//判断是否有对象被创建没有就进行创建if (instance null){instance new SingletonLazy();} }return instance;}//将构造方法设定为 static 不能进行 new 来创建private SingletonLazy(){} }这里加锁之后t1 线程已经创建了一个对象之后的 t2 线程 load 到的结果是前面线程修改的结果。因此 t2 线程就不会在创建新的对象直接返回现有的对象。 需要注意的是在这里的加锁操作在线程每进行 getInstance 操作时每次都会进行加锁但是每次的加锁都要有开销真的需要每次加锁吗我们知道在创建对象前需要进行加锁但是在第一次创建对象后后续的操作会直接触发 return对此可以对代码进行如下修改 //实现懒汉模式 class SingletonLazy{//这里先将对象不进行创建先设定为 nullprivate static SingletonLazy instance null;public static SingletonLazy getInstance(){//负责判断是否要加锁if(instance null){//通过加锁消除线程安全问题在此处加锁才能保证读操作和修改操作是一个整体synchronized (SingletonLazy.class){//判断是否有对象被创建没有就进行创建if (instance null){instance new SingletonLazy();}}}return instance;}//将构造方法设定为 static 不能进行 new 来创建private SingletonLazy(){} }注上面的两个 if 条件语句虽然条件相同但是两者之间控制的问题完全不同。 有关懒汉模式上面的加锁操作以及对加锁操作的修改仍然没有完全解决其中存在的问题。这里还存在内存可见性问题指令重排序问题。 内存可见性问题 在这里假设有很多线程都去进行 getInstance此时就很有可能有被优化的风险只有第一次读取了真正的内存后续读取的都是寄存器中的数据。 指令重排序问题 在这里我们将 instance new SingIeton(); 拆分为下面三部分。 1.申请内存空间2.调用构造方法将内存空间初始化为一个合理的对象3.将内存地址赋值给 instance 引用。 在正常情况下按照123这样的顺序进行执行的。但是在多线程的环境下就会出现问题。 假设线程 t1 是在排序后按照 132这个顺序进行执行的。当执行完 13 这两个步骤后被切出 cpu 此时 t2 进入cpu这里就出现问题了这里的 t2 拿到的是非法的对象是没有构造完成的不完整对象。 要解决上面的问题 volatile关键字可以解决问题。 volatile 关键字有下面两个功能 (1) 解决内存可见性 (2) 禁止指令重排序 代码如下 //实现懒汉模式 class SingletonLazy{//这里先将对象不进行创建先设定为 null//添加 volatile 关键字防止指令重排序解决内存可见性问题private volatile static SingletonLazy instance null;public static SingletonLazy getInstance(){//负责判断是否要加锁if(instance null){//通过加锁消除线程安全问题在此处加锁才能保证读操作和修改操作是一个整体synchronized (SingletonLazy.class){//判断是否有对象被创建没有就进行创建if (instance null){instance new SingletonLazy();}}}return instance;}//将构造方法设定为 static 不能进行 new 来创建private SingletonLazy(){} }到此关于懒汉模式的相关问题基本解决。
http://www.hkea.cn/news/14459444/

相关文章:

  • 一个网站两个域名东莞网站建设方案维护
  • 自适应型网站建设报价苍南龙港做网站店铺
  • 赣州开发区网站建设知末网效果图
  • 大连网站建设功能赣州稳稳科技有限公司
  • 唐山建设网站公司洛阳网站建设招聘信息
  • 珠宝静态网站模板seo快速排名工具
  • 免费php开源建站系统重庆沙坪坝学校
  • 昆明好的网站制作wordpress下载视频
  • 加强网站建设 统计局深圳住房和建设局网站认租申请
  • 做土豆的视频在线观看网站网站怎么做app
  • 网站或站点的第一个网页北京做网站公司哪家好
  • 致远oa办公系统官网提供搜索引擎优化公司
  • 网站介绍词怎么做网页中间部分
  • 最常见企业网站公司有哪些网页版梦幻西游探案任务攻略
  • 浙江网站建设dyfwzx做app必须有网站
  • 厦门做网站建设wordpress创建相册
  • seo网站建设哪家专业杭州网站建设招聘
  • 羊 东莞网站开发国外网站怎样建设
  • 网站过程中遇到问题电子商务企业网站的推广方式
  • 百色高端网站建设wordpress 无刷新主题
  • 山西网站开发建设服装网站建设规划
  • 做一个企业网站要多久冷库建设网站
  • 好的网站设计题目夏天做哪个网站能致富
  • 自建网站服务器备案做网站的等级保护要多少钱
  • 网站建设方案书 百度文库昆山市建设监察大队官方网站
  • 房产律师网站模板wordpress联系方式代码
  • 石家庄站内换乘图解wordpress 标签 彩色
  • 手机版网站如何制作软件赛博网站建设四川
  • 西安企业模板网站建设wordpress文章显示宽度
  • 切图做网站经典的高端网站建设公司着陆页设计