0
点赞
收藏
分享

微信扫一扫

Attributes should be specified via @SpringBootApplication 和 idea运行时提示内存不足

目录

一、单例模式的简单介绍

二、饿汉模式

三、懒汉模式

四、饿汉模式和懒汉模式的线程安全问题分析

1、饿汉模式(线程安全)

2、懒汉模式(线程不安全)

解决懒汉模式的线程安全问题

①给写操作打包成原子

②去除冗余操作

③存在指令重排序的问题

3、解决懒汉模式线程安全问题的最终代码:


一、单例模式的简单介绍

单例模式是一种设计模式,其中设计模式是软性的规定,与它关联的框架是硬性的规定,这些都是大佬已经设计好了的,即使是代码写的不是很好的菜鸡,按照这种模式也能写出还行的代码。类似象棋中的棋谱,即使你是新手,但按着棋谱走,你的棋力也不会太差。

单例 = 单个实例(对象)某个类,在一个线程中,只应该创建一个对象(原则上不应该有多个),这时就使用单例模式,就可以对我们的代码进行一个更严格的校验和检查

那么,怎么保证这一个对象唯一呢?

其一方法,可以通过“君子约定”,写一个文档,规定这个类只能有唯一的实例,新手程序猿接手这个代码时,就会发一份这个文档,进行约定,熟悉其中的规定、条约。

其二方法:可以让机器帮我们检查,人肯定是没有机器靠谱的,我们期望让机器帮我们对代码中指定的类,创建类的实例个数进行检查、校验,当创建的实例个数超过我们期望个数,就编译报错,这一点还是能实现的,其中单例模式就是已经设计好的套路,可以实现这种预期效果。


二、饿汉模式

饿汉模式是指创建实例是时期非常早,在类加载的时候,程序一启动,就已经创建好实例了,使用 “饿汉”这个词,就是形容创建实例非常迫切,非常早。下面实现一个单例模式


三、懒汉模式


四、饿汉模式和懒汉模式的线程安全问题分析

1、饿汉模式(线程安全)

代码分析:

当有多个线程,同时并发执行,调用getInstance方法,取instance,这时,线程是安全的吗?显然。这是线程安全操作,因为只涉及到读,多线程读取同一个变量,是线程安全的。而instance很早之前就已经创建好了,不会修改它,一直也只有这一个实例,也不涉及写的操作。

2、懒汉模式(线程不安全)

代码分析:

这里调用getInstance方法后,就会创建出实例来,那么我们想想,如果多个线程同时调用这个方法,此时SingletonLazy类里面的instance都为null,那么这些线程都会new对象,就会创建多个实例,这时,就不符合我们单例模式的预期了,所以,这个代码是线程不安全的。

这也是线程不安全的直接原因,就是 “写” 操作不是原子的。

解决懒汉模式的线程安全问题

①给写操作打包成原子
②去除冗余操作
③存在指令重排序的问题

3、解决懒汉模式线程安全问题的最终代码:

举报

相关推荐

0 条评论