当前位置: 首页 > news >正文

【Java_EE】设计模式

设计模式:解决一些固定场景的固定套路,是一种代码风格的知道指南。设计模式不止23种

1、单例设计模式

单例设计模式:确保一个类只有一个实例,提供全局访问点

单例模式的实现方式:

1:饿汉模式

/*** 饿汉模式*/
class SingletonPattern {private static SingletonPattern instance = new SingletonPattern();private SingletonPattern () {// 设置为private,外部类就不能通过new创建实例}public static SingletonPattern getInstance() {return instance;}
}public class SinglePattern {public static void main(String[] args) {SingletonPattern instance1 = SingletonPattern.getInstance();SingletonPattern instance2 = SingletonPattern.getInstance();System.out.println(instance1 == instance2); // true}
}

2:懒汉模式

懒汉模式(线程不安全)

此处的代码是存在线程安全问题的。

1:原子性

应该将此处代码打包成原子的,不让代码穿插操作。所以就对代码进行加锁,解决原子性问题

if(instance == null) {
            instance = new SingleLazy();
        }

2:指令重排序

instance = new SingleLazy(); 此处这个new操作实际有好几步指令,粗略分为下面三步

1:内存分配

2:初始化零值

3:执行构造函数

实际的执行顺序是1-》2-》3,但是编译器优化的指令重排序,可能会将原本执行顺序重排为1-》3-》2,所以为了避免指令重排序,需要在instance上加上volatile

class SingleLazy {/*** 单例模式* 懒汉模式:创建实例的时机比较晚,不是那么急迫*/private static SingleLazy instance = null;private SingleLazy() {}// 第一次使用实例的时候,才创建实例public static SingleLazy getInstance() {if(instance == null) {// return new SingleLazy(); // 这样写是错的,这样每次get都会newinstance = new SingleLazy();}return instance;} 
}
public class SingleLazyPattern {public static void main(String[] args) {SingleLazy instance1 = SingleLazy.getInstance();SingleLazy instance2 = SingleLazy.getInstance();System.out.println(instance1 == instance2); // true}
}

 懒汉模式(线程安全)

又在锁的外面加了一条判断,目的就是只在第一次调用getInstance方法是进行加锁,避免重复加锁

if(instance == null) 
// 如果不进行判断,那么每次调用getInstance方法都会进行加锁操作
// 但是如果加了判断,只会在第一次调用getInstance方法进行加锁操作
 

class SinglePattern {private static volatile SinglePattern instance = null; // volatile解决指令重排序问题private static Object lock = new Object();private SinglePattern() {// 避免外部创建实例}public static SinglePattern getInstance() {if(instance == null) {// 如果不进行判断,那么每次调用getInstance方法都会进行加锁操作// 但是如果加了判断,只会在第一次调用getInstance方法进行加锁操作synchronized(lock) { // 加锁,解决原子性问题if(instance == null) {instance = new SinglePattern();}}}return instance;}
}public class SingleLazyPattern {public static void main(String[] args) {SinglePattern instance1 = SinglePattern.getInstance();SinglePattern instance2 = SinglePattern.getInstance();System.out.println(instance1 == instance2);}}

相关文章:

  • 502 Bad Gateway:服务器作为网关或代理时收到无效响应处理方式
  • [pyvips] 枚举类型 | 错误处理(c->py)
  • 深入理解 MySQL 事务:保障数据操作的原子性与一致性
  • C#List的join查询
  • 分布式——分布式系统设计二——幂等性详解
  • 大事务导致数据库连接池耗尽分析与解决方案
  • 250618-通过Artifacts功能集成Open-WebUI与Gradio
  • Docker PowerJob
  • Docker搭建RabbitMQ集群环境
  • less-9-基于时间的GET单引号盲注
  • 客户端软件开发技术选择、填空解析
  • css 制作一个可以旋转的水泵效果
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | IncrementingCounter(递增计数器)
  • AiPy 监控视频智能监察:人像一键抽取+可反复执行程序落地
  • 本地使用 modelscope 大模型 来进行文本生成视频(Text-to-Video)
  • pythonday50
  • OpenLayers 加载GeoTIFF影像
  • Antv G2入门教程
  • Java常量与数据类型
  • 面向智能制造场景的永磁同步电机预测控制系统设计
  • 用备忘录制作一个网站的制作/网络服务器配置与管理
  • 北京网站优化专家/百度app打开
  • 体育网站界面该怎样做/qq群排名优化软件
  • 有几个网站如何做外贸/南昌网站建设
  • 乌鲁木齐官方网站/朋友圈广告怎么投放
  • 郑州做网站公司/百度搜索网址