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

如何看网站做的好坏中国制造网

如何看网站做的好坏,中国制造网,自己搭建服务器做网站要多久,网站开发怎么入账目录 一、什么是设计模式? 二、单例模式 1. 饿汉模式 2. 懒汉模式 懒汉模式-第一次改进 懒汉模式-第二次改进 懒汉模式-第三次改进 一、什么是设计模式? 设计模式是针对软件设计中常见问题的通用解决方案。它们提供了一种被广泛接受的方法来解决…

目录

一、什么是设计模式?

二、单例模式

1. 饿汉模式

2. 懒汉模式

懒汉模式-第一次改进

懒汉模式-第二次改进

懒汉模式-第三次改进


一、什么是设计模式?

设计模式是针对软件设计中常见问题的通用解决方案。它们提供了一种被广泛接受的方法来解决特定类型的问题,并且具有经过验证的效果和可重复使用性。设计模式不是代码或类库,而是一种解决问题的思维方式或模式。

设计模式就好比象棋中的“棋谱”,针对对方的一些走法,黑方应招的时候有一些固定的套路,按照套路走局势就不会吃亏。想要成为一名象棋高手,背棋谱其实是必然的。因此,设计模式也是开发中的一种重要的解决问题的方式。

二、单例模式

单例模式是校招中 最常考的设计模式 之⼀。
单例模式能保证某个类在程序中只存在唯一一份实例,而不会创建出多个实例。
单例模式具体的实现方式有很多,最常见的是" 饿汉"和" 懒汉"两种。

1. 饿汉模式

饿汉式单例(Eager Initialization):在类加载时就创建实例。

// 单例模式 - 饿汉模式
// 类加载的同时,直接创建实例。
class Singleton {// 在类加载时就创建实例private static Singleton instance = new Singleton();// 对外提供获取实例的静态方法public static Singleton getInstance() {return instance;}// 私有化构造方法,防止外部直接实例化private Singleton() {}
}public class Demo1 {public static void main(String[] args) {// 获取单例对象Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();// 判断两个实例是否相同System.out.println(s1 == s2);  // 输出 true,说明两个引用指向同一个实例// 以下代码会报错,因为构造方法是私有的,无法在外部直接实例化// Singleton s = new Singleton();}
}

上述代码类加载就会创建实例的原因:

在Java中,类加载时机是在首次使用该类时,Java虚拟机会负责对类进行加载、连接和初始化。在加载阶段,虚拟机会加载类的字节码并创建Class对象,而在初始化阶段,虚拟机会执行类的初始化过程,其中包括对静态变量的初始化。因此,在首次使用该类时,类会被加载并且静态变量会被初始化,从而创建单例实例

通过对构造方法的私有化,使得上述代码只有一个实例。

由于单例对象在类加载时就被创建,因此不存在线程安全问题。但如果实例很大且长时间未使用,会造成资源浪费。

2. 懒汉模式

懒汉式单例(Lazy Initialization):在第一次调用时创建实例。

public class Singleton {private static Singleton instance = null;private Singleton() {// 私有化构造方法}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

注意:此示例不是线程安全的【Java多线程(3)】线程安全问题和解决方案

线程安全问题发生在首次创建实例时,如果多个线程中同时调用getInstance方法,由于线程的抢占式执行,就可能导致创建出多个实例。

如果实例创建好了,后面在多线程环境调用getInstance就不再有线程安全问题了,因为不会再new实例了。

因此,加上synchronized 就能够解决这里的创建多个实例的问题

懒汉模式-第一次改进

public class SingletonLazy {private static volatile SingletonLazy instance = null;public static SingletonLazy getInstance() {synchronized (SingletonLazy.class) {if (instance == null) {instance = new SingletonLazy();}}return instance;}private SingletonLazy() {}
}

这样操作后,就能保证只有第一个调用getInstance方法的线程会创建实例,其余线程即使抢到CPU执行权,也会被阻塞。后续条件判断的时候也就不会再new了。

但是,饿汉模式只有在最开始调用getInstance会存在线程安全问题,后续再调用是没有线程安全问题的。而上述代码针对后续调用,明明没有线程安全问题,却还是要加锁(可能导致其他线程阻塞),这使得代码的性能大大降低了。

因此,对于这个问题,还要进行一些改进,就是只在对象还未实例化的时候对实例化对象的这段代码进行加锁

懒汉模式-第二次改进

class SingletonLazy {private static SingletonLazy instance = null;public static SingletonLazy getInstance() {if (instance == null) {synchronized (SingletonLazy.class) {if (instance == null) {instance = new SingletonLazy();}}}return instance;}private SingletonLazy() {}
}

使用双重if判定,降低锁竞争的频率。

  1. 在 getInstance() 方法中首先检查 instance 是否为 null,如果是 null,表示尚未创建实例,需要进行实例化操作。
  2. 由于该方法可能被多个线程同时调用,因此需要使用双重检查锁定来确保只有一个线程创建实例。
  3. 在第一次检查 instance 为 null 后,进入同步块,并再次检查 instance 是否为 null,以防止多个线程同时进入同步块后重复创建实例。
  4. 如果 instance 仍然为 null,则在同步块内部创建新的 SingletonLazy 实例,并将其赋值给 instance

这样的做法,即使在对象还未实例化的时候,有多个线程进入第一个if判断了,里面的锁仍会保证只有一个线程会去实例化,并且在后续线程再调用getInstance方法的时候,外层的if判断就把它挡住了,就不会再上锁了。

但是,写出双重if判定的代码的时候,强大的IDEA就已经给出了一个警告:双重检查锁定

既然IDEA都给警告了,意味着这里可能还会问题存在!

懒汉模式-第三次改进

IDEA给我们的处理方式是:给instance加上volatile关键字。

一方面,这里就又涉及到了内存可见性问题:在第一次创建实例中,被阻塞的线程有可能没有感知到instance的引用已经改变了,导致的内存可见性问题。

另一方面,就是我们在【Java多线程(3)】线程安全问题和解决方案 这篇博客中还未解决的指令重排序问题,这是我们这里要讨论的重点

指令重排序,也是编译器的一种优化策略。看一个去超市买菜的例子:

可以看到,优化后的策略节省了不少时间。

而在instance = new SingletonLazy(); 这行代码中,其实会有很多很多的指令,但是大体上可以分成三个步骤:

  1. 申请内存空间
  2. 调用构造方法(对内存空间进行初始化)
  3. 把此时内存空间的地址,赋值给 instance 引用

而在指令重排序的优化下,上述过程不一定是按 123 执行的,也可能是 132 执行(1一定先执行),这种优化策略,在单线程下都是没有问题的,但 132 在多线程下,可能就会引起bug。假设有t1和t2两个线程,线程间是按照以下顺序执行的:

volatile解决的就是上述两个问题(内存可见性和指令重排序(保证执行顺序是123))

因此,懒汉模式的最终代码就是在第二次改进的基础上,给instance加上volatile关键字。

//懒汉模式-最终代码
class SingletonLazy {private static volatile SingletonLazy instance = null;public static SingletonLazy getInstance() {if (instance == null) {synchronized (SingletonLazy.class) {if (instance == null) {instance = new SingletonLazy();}}}return instance;}private SingletonLazy() {}
}

文章转载自:
http://interleave.kryr.cn
http://industry.kryr.cn
http://ketch.kryr.cn
http://absorbed.kryr.cn
http://interclavicular.kryr.cn
http://argand.kryr.cn
http://amoy.kryr.cn
http://lystrosaurus.kryr.cn
http://telecentre.kryr.cn
http://demonography.kryr.cn
http://ruffianlike.kryr.cn
http://logger.kryr.cn
http://jacquette.kryr.cn
http://longinquity.kryr.cn
http://strongylid.kryr.cn
http://unbodied.kryr.cn
http://laurasia.kryr.cn
http://mcg.kryr.cn
http://whacko.kryr.cn
http://exfacie.kryr.cn
http://allahabad.kryr.cn
http://finnicky.kryr.cn
http://countability.kryr.cn
http://tenth.kryr.cn
http://numina.kryr.cn
http://clarinet.kryr.cn
http://saskatchewan.kryr.cn
http://colonization.kryr.cn
http://pupillary.kryr.cn
http://flexuose.kryr.cn
http://visibly.kryr.cn
http://battercake.kryr.cn
http://suprathermal.kryr.cn
http://attune.kryr.cn
http://alga.kryr.cn
http://srv.kryr.cn
http://prankster.kryr.cn
http://interstratification.kryr.cn
http://juvenescence.kryr.cn
http://parnassian.kryr.cn
http://indwelling.kryr.cn
http://rodder.kryr.cn
http://nyasa.kryr.cn
http://biotransformation.kryr.cn
http://extinguishment.kryr.cn
http://aciniform.kryr.cn
http://emplastic.kryr.cn
http://proconsulship.kryr.cn
http://transcend.kryr.cn
http://smaragdite.kryr.cn
http://summerhouse.kryr.cn
http://absorbent.kryr.cn
http://archivist.kryr.cn
http://cad.kryr.cn
http://kieselguhr.kryr.cn
http://coercionary.kryr.cn
http://villanage.kryr.cn
http://publish.kryr.cn
http://taxeme.kryr.cn
http://bacterization.kryr.cn
http://beastly.kryr.cn
http://dermatophyte.kryr.cn
http://shepherdless.kryr.cn
http://whereabouts.kryr.cn
http://symbology.kryr.cn
http://talcose.kryr.cn
http://airwash.kryr.cn
http://prag.kryr.cn
http://kolkhoz.kryr.cn
http://trame.kryr.cn
http://yannigan.kryr.cn
http://baalism.kryr.cn
http://radiogoniometer.kryr.cn
http://histogenetically.kryr.cn
http://indignantly.kryr.cn
http://limberly.kryr.cn
http://montmorillonoid.kryr.cn
http://undeserved.kryr.cn
http://bobbery.kryr.cn
http://zimbabwean.kryr.cn
http://ugly.kryr.cn
http://forklike.kryr.cn
http://lucy.kryr.cn
http://struthioid.kryr.cn
http://biothythm.kryr.cn
http://wigmaker.kryr.cn
http://dazzling.kryr.cn
http://rim.kryr.cn
http://imparticipable.kryr.cn
http://historiette.kryr.cn
http://ash.kryr.cn
http://biaxial.kryr.cn
http://microteaching.kryr.cn
http://downhill.kryr.cn
http://prejudicial.kryr.cn
http://acd.kryr.cn
http://vinsanto.kryr.cn
http://scotoma.kryr.cn
http://medico.kryr.cn
http://hangar.kryr.cn
http://www.15wanjia.com/news/90890.html

相关文章:

  • 企业网站备案怎么搞seo新人培训班
  • 自己做网站代码百度推广开户联系方式
  • 深圳网站建房关键词你们都搜什么
  • 陕西西乡网站建设济南网站建设制作
  • 网站建设就业上海网络推广培训学校
  • 北京专业网站翻译影音字幕翻译速记速记速记快而高效长春网站优化体验
  • 武汉简单做网站网络推广和运营的区别
  • 公司做网站一般要多少钱百度推广平台登陆
  • 惠州市网站建设google搜索关键词热度
  • 做公司网站怎么推广企业自建网站
  • 电子商务网站建设与维护教案调研报告万能模板
  • 什么网站做美式软装设计方案信息流推广的竞价机制是
  • 上海八号桥 网站建设app推广工作靠谱吗
  • 泉州做外贸网站百度一下百度官方网
  • 最早做网页的公司珠海seo排名收费
  • 免费做淘宝客网站有哪些旅游网站网页设计
  • 网站开发需要如何压缩代码百度seo网站
  • 网站上传的工具seo好seo
  • 甘肃做网站的公司有哪些关键词优化简易
  • 汕头高端网站开发chrome浏览器下载安卓手机
  • 福田做商城网站建设哪家公司靠谱无人区在线观看高清1080
  • 网站的建设属于无形资产吗代发关键词包收录
  • 网站建站加盟佛山seo
  • wordpress supports网站百度关键词优化
  • 潍坊专升本教育机构seo网站优化公司
  • 海南行指三亚网站开发网址域名注册
  • 一学一做教育视频网站石家庄seo结算
  • phpmysql动态网站开发与全程实例合肥关键词快速排名
  • 980网站网站关键词排名优化电话
  • 网站顶部布局怎么做营销