首页 > 其他分享 >单例模式

单例模式

时间:2023-02-08 15:13:45浏览次数:40  
标签:模式 装载 实例 线程 单例 sing 加载

1、单例模式

1)懒汉式

多线程的情况下就会出问题,例如两个线程同时判断Instance是否为空,此时Instance还没创建好,那么两者都会创建一个实例

2)在1)的基础上加上同步锁

每次通过getIns()方法获取单例时,都有一个试图去获取同步锁的过程,而加锁是很费时的,能免就免

3)双重校验锁

volatile的作用:new操作在底层分为三步:1、为对象分配空间。2、实例化对象。3、把sing引用指向分配的内存空间。如果没有volatile,则可能指令重排列1,3,2,一个线程执行到3时,sing已经不是null,此时线程2判断sing!=null,则直接返回sing的引用,但现在实例对象还没有初始化完成,此时线程2使用sing可能会造成程序异常。

4) 饿汉

sing为static类型,在类装载时就实例化

 5) 静态内部类

 

利用了classloader的机制来保证初始化sing时只有一个线程,跟4)不一样的地方在于,4)只要Single类被装载了,那么sing实例就会被实例化,而这种方法是Single类被装载了,sing不一定被初始化,因为SingleHolder没有被主动使用,只有通过调用getIns()方法时才会显示装载SingleHolder类,从而实例化sing。想象一下如果实例化sing很耗资源,想延迟加载。这个方法就很合适。

对于java类加载机制来说,当第一次访问类的静态字段的时候,会触发类加载,并且同一个类只加载一次。静态内部类也是如此,只会被加载一次,类加载过程由类加载器负责加锁,从而保证线程安全

 6)枚举方式

能避免多线程同步问题,而且能防止反序列化重新创建对象

 

标签:模式,装载,实例,线程,单例,sing,加载
From: https://www.cnblogs.com/MarkLeeBYR/p/17101812.html

相关文章