JavaWeb15-单例模式
创始人
2024-06-01 15:52:50
0

目录

1.设计模式是啥?

2.单例模式是啥?

3.单例模式的实现步骤

3.1.设置私有的构造函数(为了防止其他类直接new此对象)。

3.2.声明⼀个私有的对象属性。

3.3.提供⼀个公共的获取实例的⽅法。

4.单例模式具体的实现方式:分成 "饿汉" 和 "懒汉" 两种

4.1.饿汉方式

4.2.懒汉方式

a.全局加锁(线程安全、性能比较低)

b.局部加锁【最终版本】(线程安全,双重效验锁DCL(Double Check Lock))


1.设计模式是啥?

设计模式好⽐象棋中的 "棋谱",红⽅当头炮, ⿊⽅⻢来跳。针对红⽅的⼀些⾛法, ⿊⽅应招的时候有⼀些固定的套路。按照套路来⾛局势就不会吃亏。

软件开发中也有很多常⻅的 "问题场景",针对这些问题场景, ⼤佬们总结出了⼀些固定的套路,按照这个套路来实现代码, 也不会吃亏。

2.单例模式是啥?

单例模式是校招中最常考的设计模式之一。

单例模式能保证某个类在程序中只存在唯⼀⼀份实例,⽽不会创建出多个实例。

这⼀点在很多场景上都需要。⽐如 JDBC 中的 DataSource 实例就只需要⼀个。

3.单例模式的实现步骤

3.1.设置私有的构造函数(为了防止其他类直接new此对象)。

3.2.声明⼀个私有的对象属性。

3.3.提供⼀个公共的获取实例的⽅法。

4.单例模式具体的实现方式:分成 "饿汉" 和 "懒汉" 两种

4.1.饿汉方式

程序启动之后,立马创建单例对象。

优点:线程安全的。

缺点:可能造成资源的浪费,通常不使用。

/*** DataSource单例模式* 饿汉模式*/
public class DataSourceSingleton {//1.创建一个私有的构造函数(为防止其他类直接new此对象)private DataSourceSingleton() {}//2.创建一个私有的属性对象private static DataSourceSingleton dataSource = new DataSourceSingleton(); //随着程序(JVM)启动而执行//3.创建一个公共的对外暴露的单例对象public static DataSourceSingleton getInstance() {return dataSource;}
}
public class DataSourceTest {public static void main(String[] args) {System.out.println(DataSourceSingleton.getInstance());}
}

4.2.懒汉方式

当有程序调用单例对象时才初始化,可以避免资源不必要的浪费。

public class DataSourceSingleton2 {//1.私有的构造方法private DataSourceSingleton2() {}//2.创建一个私有的属性private static DataSourceSingleton2 dataSource;//3.创建一个对外提供访问的单例对象public static DataSourceSingleton2 getInstance() {if(dataSource == null){ //第一次访问try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}dataSource = new DataSourceSingleton2(); //当线程1和线程2同时走到这里,线程1->null->对象1;线程2->null->对象2.不满足单例模式的定义。}return dataSource;}
}
public class DataSourceTest {public static void main(String[] args) {Thread t1 = new Thread(() -> {System.out.println(DataSourceSingleton2.getInstance());});Thread t2 = new Thread(() -> {System.out.println(DataSourceSingleton2.getInstance());});t1.start();t2.start();}
}

默认的懒汉模式是非线程安全的,使用要对懒汉进行优化,优化改进:

a.全局加锁(线程安全、性能比较低)

/*** 单例模式--懒汉模式1*/
public class DataSourceSingleton2 {//1.私有的构造方法private DataSourceSingleton2() {}//2.创建一个私有的属性private static DataSourceSingleton2 dataSource;//3.创建一个对外提供访问的单例对象public synchronized static DataSourceSingleton2 getInstance() {if(dataSource == null){ //第一次访问try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}dataSource = new DataSourceSingleton2(); }return dataSource;}
}

b.局部加锁【最终版本】(线程安全,双重效验锁DCL(Double Check Lock))

/*** 单例模式--懒汉模式2*/
public class DataSourceSingleton3 {//1.私有的构造方法private DataSourceSingleton3() {}//2.私有属性private static volatile DataSourceSingleton3 dataSource = null; //属性标识为volatile//3.公共的方法,得到单例对象public static DataSourceSingleton3 getInstance() {if (dataSource == null) { //大致分流状态 DCLsynchronized (DataSourceSingleton3.class) { //排队执行if(dataSource == null) { //精细化判断(分流) DCLdataSource = new DataSourceSingleton3();}}}return dataSource;}
}

若属性没有标识为volatile,则对象创建需要三步:

  1. memory = allocate() //分配内存

  2. ctorInstanc(memory) //初始化对象

  3. instance = memory //设置instance指向刚分配的地址

假如因为指令重排导致执⾏的顺序变为了132,那么假如a线程中执⾏完13之后,b线程到达代码2处,执⾏判断语句,发现instance指向的是⼀段地址,因此直接不进⼊判断语句,⽽是直接返回了⼀个没有初始化的空的对象。

相关内容

热门资讯

《秋水时至》文言文阅读及答案 《秋水时至》文言文阅读及答案  阅读并回答问题。  秋水时至,百川灌河。泾流之大,两涘渚崖之间,不辩...
《岳阳楼记》的原文及译文 《岳阳楼记》的原文及译文  《岳阳楼记》是北宋文学家范仲淹于庆历六年九月十五日(1046年10月17...
诗经取名女孩 诗经取名女孩大全  利用诗经取名,一直是中国人非常擅长和喜欢的一件事,诗经中含有哲理,含有思想,含有...
杜甫《春夜喜雨》全诗以及解释 杜甫《春夜喜雨》全诗以及解释  杜甫的《春夜喜雨》是描绘春夜雨景,表现喜悦心情的名作。下面我们为大家...
桃花源记读后感 桃花源记读后感(精选15篇)  认真品味一部名著后,相信你一定有很多值得分享的收获,为此需要认真地写...
花落人亡,红楼梦断-读《红楼... 花落人亡,红楼梦断-读《红楼梦》有感作文900字  一曲《红楼梦》,将人世间哀情道遍;一首《葬花吟》...
本草纲目律草文言文 本草纲目律草文言文  作者:李时珍  释名  勒草、葛勒蔓、来莓草。  气味  甘、苦、寒、无毒。 ...
北人生而不识菱者文言文翻译注... 北人生而不识菱者文言文翻译注释及道理  1、文言文  北人生而不识菱者,仕于南方。席上啖菱,并壳入口...
李白传读后感 李白传读后感(精选5篇)  读完一本名著以后,你心中有什么感想呢?这时候,最关键的读后感怎么能落下!...
梦游天姥吟留别高考语文考点 梦游天姥吟留别高考语文考点  原文:  海客谈瀛洲,烟涛微茫信难求,越人语天姥,云霞明灭或可睹。天姥...
乡愁体的作文600字 乡愁体的作文600字  《乡愁》以朴素、简明、隽永的语言,高超的艺术技巧,表达了台湾人民盼望海峡两岸...
《长干曲其二》的原文赏析及翻... 《长干曲其二》的原文赏析及翻译注释  长干曲 其二  崔颢  家临九江水,来去九江侧。  同是长干人...
《山海经》异兽介绍 《山海经》异兽介绍  山海经里的奇珍异兽很多,是集齐古人智慧与想象力的书。小编整理了《山海经》异兽介...
红楼梦读后感300字 红楼梦读后感300字(通用11篇)  当看完一本著作后,想必你有不少可以分享的东西,此时需要认真地做...
《名人传》简介   《名人传》简介  作者介绍:  罗曼·罗兰(Romain Rolland,1866——1944)...
《小石潭记》中考真题 历年语文高考真题与答案推荐度:历年英语高考真题与答案推荐度:高考语文全国乙卷真题和答案推荐度:新高考...
林采薇简介 林采薇简介  林采薇(Yumi ),3月5日出生于台湾台北。就读于台湾辅仁大学韩语系,现为伊林模特儿...
《水调歌头再用韵呈南涧》诗词 《水调歌头再用韵呈南涧》诗词  水调歌头 再用韵呈南涧 辛弃疾 宋  千古老蟾口,云洞插天开。涨痕当...
将进酒 李白拼音版 将进酒 李白拼音版  qiāng jìn jiǔ  将 进 酒  jūn bú jiàn huáng...
三字经全文句句赏析 三字经全文句句赏析  rén zhī chū xìng běn shàn xìng xiāng jì...