浙江省互联网建设网站两学一做教育考试网站
- 作者: 五速梦信息网
- 时间: 2026年04月20日 03:42
当前位置: 首页 > 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(){} }到此关于懒汉模式的相关问题基本解决。
- 上一篇: 浙江省城乡和住房建设厅网站首页浙江网站建设优化
- 下一篇: 浙江省嘉兴市建设局网站徐州信息网官网
相关文章
-
浙江省城乡和住房建设厅网站首页浙江网站建设优化
浙江省城乡和住房建设厅网站首页浙江网站建设优化
- 技术栈
- 2026年04月20日
-
浙江建筑网站店铺设计效果图
浙江建筑网站店铺设计效果图
- 技术栈
- 2026年04月20日
-
浙江建设职业技术学院尔雅网站电商网站建设与运行
浙江建设职业技术学院尔雅网站电商网站建设与运行
- 技术栈
- 2026年04月20日
-
浙江省嘉兴市建设局网站徐州信息网官网
浙江省嘉兴市建设局网站徐州信息网官网
- 技术栈
- 2026年04月20日
-
浙江省建设工程监理管理协会网站网页界面设计是什么
浙江省建设工程监理管理协会网站网页界面设计是什么
- 技术栈
- 2026年04月20日
-
浙江省建设会计协会网站首页天津装修公司哪家口碑好些
浙江省建设会计协会网站首页天津装修公司哪家口碑好些
- 技术栈
- 2026年04月20日






