【不就是Java设计模式吗】解密单例八种设计模式,带你整理代码思路

最后

给大家送一个小福利

附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 结论与分析

  • 🏳‍🌈分类2:懒汉式

    • 方式1
    • 代码
  • 🔥思路

  • 结论与分析

  • 方式2

    • 代码
  • 🔥思路

  • 结论与分析

  • 方式3

    • 代码
  • 🔥思路

  • 结论与分析

  • 🏳‍🌈分类3:双重检查

      • 代码
  • 🔥思路

  • 总结分析

  • 🏳‍🌈分类4:静态内部类

      • 代码
  • 🔥思路

  • 总结分析

  • 🏳‍🌈分类5:枚举

      • 代码
  • 🔥思路

  • 总结分析

  • 三、🍂使用场景

  • 四、🍂总结

🧡前言

=======================================================================

先看看思维导图:

在这里插入图片描述

📕在学习Java基础的时候,曾天真的以为单例设计模式就是懒汉式和饿汉式这两种。今天在B站学习了单例设计模式,真是打开了新世界的大门,自己总结了单例模式的学习笔记,从代码到自己的思路,最后到每一种方式的小结,相信小伙伴们看了后会有所收获

一、🍂模式介绍

===========================================================================

所谓单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类

只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)

二、🍂分类

=========================================================================

🏳‍🌈分类1:饿汉式


静态常量饿汉式

代码

public class Test01 {

public static void main(String[] args) {

Singleton instance1 = Singleton.getInstance();

Singleton instance2 = Singleton.getInstance();

//结果是true,说明是同一个对象实例

System.out.println(instance1 == instance2);

}

}

class Singleton {

//构造器私有化,外部不能通过new的方式创建此类的对象

private Singleton() {}

//本类内部创建对象实例

private final static Singleton instance = new Singleton();

//提供静态方法,得到实例对象

public static Singleton getInstance() {

return instance;

}

}

🔥思路

🚩先创建私有构造器,然后创建私有的final的静态对象,最后提供一个可以得到实例对象的方法

结论与分析

线程安全,写法简单,该方式可用,在类装载的时候就完成了实例化。也就是因为在类装载的时候完成了实例化,所以,如果从始至终都从未使用过这个实例,就造成了内存的浪费

静态代码块饿汉式

代码

class Singleton {

private Singleton() {}

private static Singleton instance;

static {

instance = new Singleton();

}

public static Singleton getInstance() {

return instance;

}

}

🔥思路

🚩先创建私有类构造器,然后创建私有静态类引用,接着在静态代码块中给引用创建实例,最后提供一个可以得到实例对象的方法

结论与分析

线程安全,写法简单,该方式可用,在类装载的时候就完成了实例化。也就是因为在类装载的时候完成了实例化,所以,如果从始至终都从未使用过这个实例,就造成了内存的浪费

🏳‍🌈分类2:懒汉式


方式1

代码

class Singleton{

private Singleton(){}

private static Singleton instance;

//当使用该方法时,才去创建对象

public static Singleton getInstance(){

if (instance == null)

instance = new Singleton();

return instance;

}

}

🔥思路

🚩跟前面的饿汉式思路差不多,先创建一个私有类构造器,然后提供私有静态引用,最后写一个静态方法用来得到引用的对象实例;其中,引用的对象实例是用if (instance == null)来判断是否赋值的

结论与分析

线程不安全,当在多线程下,一个线程进入了if (instance == null)判断语句,还未来得及往下执行,另一个线程也通过了这个判断语句,这时候就可能产生多个实例,不建议使用

方式2

代码

class Singleton{

private static Singleton instance;

private Singleton(){}

//加入同步处理的代码,解决线程安全问题

public static synchronized Singleton getInstance(){

if (instance == null)

instance = new Singleton();

return instance;

}

}

🔥思路

🚩思路跟方式1就是在方法中多了一个synchronized,可以保证线程安全

结论与分析

线程安全,但是效率低。每个线程在想获得类的实例的时候,执行getInstance()都要进行同步,其实这个方法只执行一次实例化代码就可以了,不推荐使用

方式3

代码

class Singleton{

private static Singleton instance;

private Singleton(){}

public static Singleton getInstance(){

if (instance == null){

synchronized(Singleton.class){

instance = new Singleton();

}

}

return instance;

}

}

🔥思路

🚩跟前面的代码没有很大区别,不同的是,方式3把synchronized线程同步问题放在getInstance()里面,但是并没有解决安全问题

结论与分析

一线互联网大厂Java核心面试题库

image

正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

-1715482672441)]

正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值