没有合适的资源?快使用搜索试试~ 我知道了~
}} 1、在类初始化时不初始化对象,在真正需要使用的时候再创建(懒加载)2、如果在单线程时 synchronized 关键字可以不
资源详情
资源评论
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/86344724/bg1.jpg)
一 单例设计模式
1 定义与使用场景
1、在内存中一个类有且仅有一个对象实例
2、由于单例设计模式只有一个对象实例,避免产生多个对象造成的资源浪费问题。
3、如果一个对象需要消耗较多的资源或初始化较慢的,可以通过单例设计模式产生一
个常驻内存的方式来实现。(IO 操作、数据库操作、配置读取操作等)
2 实现方式
1.私有构造方法
2.提供 static 属性
3.提供一个获取实例的方法 getInstance()
3 饿汉式
1、在类初始化时就立即加载了对象,不管之后是不是需要使用到它,没有懒加载的优
势。
![](https://csdnimg.cn/release/download_crawler_static/86344724/bg2.jpg)
2、由于在类加载时,是一个天然的线程安全的模式,所以避免了多线程并发创建对象
的问题
3、由于没有使用同步锁,所以并发调用效率较高
为什么是线程安全的?
首先,singleton 作为类成员变量的实例化发生在类 Singleton 类加载的初始化阶段,
初始化阶段是执行类构造器<clinit>() 方法的过程。
<clinit>() 方法是由编译器自动收集类中的所有类变量(static)的赋值动作和静态语句
块(static{})块中的语句合并产生的。因此,private static Singleton singleton = new Singleton();
也会被放入到这个方法中。
虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确的加锁、同步,如果多个线
程同时去初始化一个类,那么只会有一个线程去执行这个类的<clinit>()方法,其他线程都需
要阻塞等待,直到活动线程执行<clinit>()方法完毕。需要注意的是,其他线程虽然会被阻塞,
但如果执行<clinit>()方法的那条线程退出<clinit>()方法后,其他线程唤醒后不会再次进入
<clinit>()方法。同一个类加载器下,一个类型只会初始化一次。
4 懒汉式
public class LazySingleton {
private static LazySingleton lazySingleton ;
private LazySingleton () {
}
public static LazySingleton getInstance(){
if(!Optional.ofNullable(lazySingleton).isPresent()){
return lazySingleton = new LazySingleton();
}
return lazySingleton ;
![](https://csdnimg.cn/release/download_crawler_static/86344724/bg3.jpg)
}
}
1、在类初始化时不初始化对象,在真正需要使用的时候再创建(懒加载)
2、如果在单线程时 synchronized 关键字可以不加,但是在多线程并发的情况下就必
须通过 synchronized 关键字来保证生成有且一个实例
3、由于使用 synchronized 关键字导致并发的时候效率不高
解决方法 1、:添加 synchronized 关键字
添加 synchronized 关键字,但是效率比较低,解决懒加载问题
解决方法二 double check
解决问题 2:使用 double check,解决效率问题,实现单例。但是可能会造成空指针问
题。对象在初始化工程中,可能值还没有初始化完成,就切换得到另一个线程,判断部位
null,但是会造成空
![](https://csdnimg.cn/release/download_crawler_static/86344724/bg4.jpg)
首先我们分析一下为什么需要两次判空
第一层判空主要是为了避免不必要的同步
第二层判空主要是为了确保在 mInstance = null 情况下进行实例化。举例: 假设 A、
B 线程同时走到 synchronized 进行同步,将 B 线程挂起后,A 线程通过 if (mInstance == null)
判断,进行对象的实例化操作。A 线程完成后,B 线程就开始进判断 if (mInstance == null)
这时 mInstance 已经被实例化了,所以跳出了同步代码块。
线程安全问题:
由于 mInstance = new LazySingleton2() 这句代码看起来虽然只有一句,但是它并
不是原子操作
1.为 mInstance 分配内存
2.使用 LazySingleton()的构造方法初始化成员变量
3.将 mInstance 对象指向分配的内存空间(执行完 mInstance 就为不等于 null)
编译器和处理器会对指令进行重排序。正常的顺应该为 1->2->3,但是重排序之
后,可能会将顺序变为 1->3->2。我们将注意力移到第一层判空 if (mInstance == null) ,
![](https://csdnimg.cn/release/download_crawler_static/86344724/bg5.jpg)
在判空的时候如果指令顺序以 1->3->2 的顺序执行,并且执行了 3 还未执行 2 时,就出现
了 mInstance 不等于 null 的情况,就直接将 mInstance 返回并拿去使用,但这时 mInstance
并未完成初始化的操作,使用的一定会存在问题。总得来说就是避免其它线程可能会看到一
个未完全初始化的对象实例。
1 使用 volatile 解决
volatile 关键字
1.可以提供线程共享变量的可见性(体现为并发编程的可见性)
2.禁止指令重排序(体现为并发编程的有序性)
public class SingletonObject5 {
private static volatile SingletonObject5 instance;
private SingletonObject5(){
}
public static SingletonObject5 getInstance(){
if(null==instance){
synchronized (SingletonObject5.class){
if(null==instance){
instance = new SingletonObject5();
}
}
}
return instance;
}
}
5 .静态内部类实现单例
public class SingletonObject6 {
private SingletonObject6(){
剩余62页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![md](https://img-home.csdnimg.cn/images/20210720083646.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![avatar](https://profile-avatar.csdnimg.cn/1dde88a17067428980048ec473e3edaf_weixin_35792040.jpg!1)
是因为太久
- 粉丝: 21
- 资源: 295
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)
评论0