Java常用设计模式-单例模式(Singleton Pattern)
时间:2022-07-23
本文章向大家介绍Java常用设计模式-单例模式(Singleton Pattern),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式
特点:
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例
懒汉式:
package com.example;
/**
* 懒汉式
* 加锁 synchronized线程安全
*/
public class Student {
private static Student student;
private Student(){};
public static synchronized Student getInstance(){
if (student == null) {
student = new Student();
}
return student;
}
public static void main(String[] args) {
Student student1 = Student.getInstance();
Student student2 = Student.getInstance();
if(student1 == student2){
System.out.println("同一个学生");
}else{
System.out.println("不是同一个学生");
}
}
}
输出结果:
饿汉式:
package com.example;
/**
* 饿汉式
* 多线程安全
* 类加载时就初始化
*/
public class Student1 {
private static Student1 student1 = new Student1();
private Student1(){};
public static synchronized Student1 getInstance(){
return student1;
}
public static void main(String[] args) {
Student1 student1 = Student1.getInstance();
Student1 student2 = Student1.getInstance();
if(student1 == student2){
System.out.println("同一个学生");
}else{
System.out.println("不是同一个学生");
}
}
}
输出结果:
双重校验锁
package com.example;
/**
* 双重校验锁
* 线程安全
*/
public class Student2 {
private volatile static Student2 student2;
private Student2 (){}
public static Student2 getInstance() {
if (student2 == null) {
synchronized (Student2.class) {
if (student2 == null) {
student2 = new Student2();
}
}
}
return student2;
}
public static void main(String[] args) {
Student2 student1 = Student2.getInstance();
Student2 student2 = Student2.getInstance();
if(student1 == student2){
System.out.println("同一个学生");
}else{
System.out.println("不是同一个学生");
}
}
}
输出结果:
- Spring实战——无需一行xml配置实现自动化注入
- 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)
- RabbitMQ入门-Routing直连模式
- WCF技术剖析之三十二:一步步创建一个完整的分布式事务应用
- .NET的资源并不限于.resx文件,你可以采用任意存储形式[上篇]
- RabbitMQ入门-消息订阅模式
- 年终盘点:2018最值得学习的几种热门编程语言
- 如何编写没有Try/Catch的程序
- RabbitMQ入门-消息派发那些事儿
- RabbitMQ入门-高效的Work模式
- 谈谈分布式事务之四: 两种事务处理协议OleTx与WS-AT
- RabbitMQ入门-从HelloWorld开始
- RabbitMQ入门-从HelloWorld开始
- RabbitMQ入门-初识RabbitMQ
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Ubuntu16升级Python3
- JavaScript 进阶教程(3)---让你彻底搞懂原型链和继承
- 第五天:结构型模式--适配器模式
- 第六天:结构型模式--修饰器模式
- 第一章--第二节:我的第一个Python项目
- 第二章--第一节:变量、字符串与数字
- 第二章--第二节:注释
- 骚操作 | 用 Python 实现 GIF 倒放
- TensorFlow学习笔记--CIFAR-10 图像识别
- TensorFlow学习笔记--自定义图像识别
- TensorFlow学习笔记--Deep Dream模型
- Python入门系列第二章--第一节:变量、字符串与数字
- JavaWeb - Filter 和 Listener
- Python入门系列第一章--第二节:我的第一个Python项目
- Python入门系列第二章--第二节:注释