最后
给大家送一个小福利
附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。
-
结论与分析
-
🏳🌈分类2:懒汉式
-
- 方式1
-
- 代码
-
🔥思路
-
结论与分析
-
方式2
-
- 代码
-
🔥思路
-
结论与分析
-
方式3
-
- 代码
-
🔥思路
-
结论与分析
-
🏳🌈分类3:双重检查
-
-
- 代码
-
-
🔥思路
-
总结分析
-
🏳🌈分类4:静态内部类
-
-
- 代码
-
-
🔥思路
-
总结分析
-
🏳🌈分类5:枚举
-
-
- 代码
-
-
🔥思路
-
总结分析
-
三、🍂使用场景
-
四、🍂总结
=======================================================================
先看看思维导图:
📕在学习Java基础的时候,曾天真的以为单例设计模式就是懒汉式和饿汉式这两种。今天在B站学习了单例设计模式,真是打开了新世界的大门,自己总结了单例模式的学习笔记,从代码到自己的思路,最后到每一种方式的小结,相信小伙伴们看了后会有所收获
===========================================================================
所谓单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类
只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)
=========================================================================
静态常量饿汉式
代码
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;
}
}
🔥思路
🚩先创建私有类构造器,然后创建私有静态类引用,接着在静态代码块中给引用创建实例,最后提供一个可以得到实例对象的方法
结论与分析
线程安全,写法简单,该方式可用,在类装载的时候就完成了实例化。也就是因为在类装载的时候完成了实例化,所以,如果从始至终都从未使用过这个实例,就造成了内存的浪费
方式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核心面试题库
正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!
-1715482672441)]
正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!