已解决
【单例模式】饿汉式,懒汉式?JAVA如何实现单例?线程安全吗?
来自网友在路上 155855提问 提问时间:2023-10-27 20:46:02阅读次数: 55
最佳答案 问答题库558位专家为你答疑解惑
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~
单例设计模式
- Java单例设计模式
Java单例设计模式
- 单例设计模式(Singleton):单例即唯一实例,某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。(例如:代表
JVM
运行环境的Runtime类)
要点
:
- ①某个类只能有一个实例。
-
- 构造器私有化。
- ②这个类必须自行创建这个实例。
-
- 含有一个该类的静态变量来保存这个唯一的实例。
- ③这个类必须自行向整个系统提供这个实例。
-
- 对外提供获取该实例的方式:
-
-
- 直接暴露
- 用静态变量的get方法获取
-
饿汉式
:
- 饿汉式:直接创建对象,不存在线程安全问题。(在类初始化时直接创建对象,不管你是否需要这个对象都会创建)
- 实现方式:
-
- 直接实例化饿汉式(简洁明了)
- 枚举式(最简洁)
- 静态代码块饿汉式(适合复杂实例化)
- 直接实例化
//Singleton:单例设计模式,软件开发中常见的设计模式之一//单例设计模式——饿汉式1:直接实例化饿汉式
/** 1.构造器私有化* 2.自行创建,并且用静态变量保存* 3.向外提供这个实例* 4.使用final修饰,强调这是一个单例*/
public class Singleton_hungry1 {//直接实例化private static final Singleton_hungry1 INSTANCE = new Singleton_hungry1();//构造器私有化private Singleton_hungry1(){}}
- 枚举式
/*** 枚举类型:表示该类型的变量是有限的几个* 我们可以限定为一个,从而成了单例**/
public enum Singleton_hungry2 {//枚举类型的实例INSTANCE;private Singleton_hungry2() {}
}
- 静态代码块
public class Singleton_hungry3 {public static final Singleton_hungry3 INSTANCE;static {//复杂情况在静态代码块中解决INSTANCE = new Singleton_hungry3();}private Singleton_hungry3() {}
}
懒汉式
:
- 懒汉式:延迟创建对象。
- 实现方式:
- 线程不安全(适用于单线程)
- 线程安全(适用于多线程)
- 静态内部类形式(适用于多线程)
- 线程不安全
/** 懒汉式:延迟创建这个实例对象* 1. 构造器私有化* 2.用一个静态变量保存唯一实例* 3.提供一个静态方法,用于获取实例*/
public class Singleton4 {private static Singleton4 instance;private Singleton4() {}//线程不安全public static Singleton4 getInstance() {if(instance == null) {instance = new Singleton4();}return instance;}}
- 线程安全
public class Singleton5 {private static Singleton5 instance;private Singleton5() {}public static Singleton5 getInstance() {//上锁、线程安全synchronized(Singleton5.class){if(instance == null) {instance = new Singleton5();}}return instance;}}
- 静态内部类形式
/** 懒汉式:延迟创建这个实例对象* 1. 构造器私有化* 2.用一个静态变量保存唯一实例* 3.提供一个静态方法,用于获取实例*/
public class Singleton6 {private Singleton6() {}//内部类:静态内部类不会随着外部类的加载和初始化而初始化,它是要单独去加载和初始化的//唯一实例因为是在内部类加载和初始化时才创建的,所以线程安全private static class inner{//唯一实例: 在内部类被加载和初始化时才被创建private static Singleton6 instance = new Singleton6();}public static Singleton6 getInstance() {return inner.instance;}}
查看全文
99%的人还看了
相似问题
- 详解Python安装requests库的实例代码
- 腾讯云4核8G服务器配置价格表,轻量和CVM标准型S5实例
- 类方法,静态方法和实例方法的区别及应用场景
- C#WPF用户控件及自定义控件实例
- 【机器学习】 逻辑回归算法:原理、精确率、召回率、实例应用(癌症病例预测)
- C语言童年生活二三事(ZZULIOJ1091:童年生活二三事(多实例测试))
- QT基础入门【QSS】QT伪状态类型和实例
- spider 网页爬虫中的 AWS 实例数据获取问题及解决方案
- 适合小白的超详细yolov8环境配置+实例运行教程,从零开始教你如何使用yolov8训练自己的数据集(Windows+conda+pycharm)
- python:list和dict的基本操作实例
猜你感兴趣
版权申明
本文"【单例模式】饿汉式,懒汉式?JAVA如何实现单例?线程安全吗?":http://eshow365.cn/6-26303-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!