自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(149)
  • 资源 (1)
  • 收藏
  • 关注

原创 JVM 运行时数据区解析

在Java的世界里,Java虚拟机(JVM)是每个开发者都绕不开的核心概念。特别是从Java 8开始,它引入了许多改进和优化,其中对JVM运行时数据区的调整尤为显著。本文将探讨Java 8版本中JVM的运行时数据组成及其各个组件的作用与特点。

2025-03-22 17:37:34 934

原创 Java对象相等性全解析:从==到equals避坑指南

基本数据类型:直接使用==运算符进行比较。包装类:建议使用equals()方法进行比较,特别是在不确定值范围的情况下。引用类型:通常需要重写equals()方法来实现基于内容的比较,并且建议同时覆盖hashCode()方法。数组:使用或进行比较。枚举类型:可以直接使用==运算符进行比较。字符串:使用equals()方法进行内容比较,但在某些情况下可以使用==进行引用比较。集合类型List:使用equals()方法进行比较,顺序和内容都必须一致。Set:使用equals()

2025-03-16 17:23:05 1031

原创 如何用Java的AQS实现高并发计数器?

AbstractQueuedSynchronizer(AQS)是Java并发包中的一个核心类,它为实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(如信号量、事件等)提供了一个基础框架。AQS通过一个int类型的state变量来表示同步状态,并通过内置的FIFO队列来管理等待线程。Java中的AQS框架为构建各种多线程同步工具提供了强大的基础。:允许一个或多个线程等待,直到其他线程完成一系列操作,适用于一次性同步的场景。

2025-03-02 12:54:03 882

原创 Java乐观锁:从‘锁’到‘不锁’的艺术

乐观锁的核心思想是假设数据在大多数情况下不会发生冲突,所以在访问数据时不会加锁。当需要更新数据时,会先检查数据在读取之后是否被其他线程修改过。如果没有被修改,则进行更新操作;如果被修改了,则根据具体的实现策略进行处理,比如重试操作或者抛出异常。乐观锁通常使用版本号(Version)或者 CAS(Compare - And - Swap)操作来实现这种检查机制。在CAS操作中,存在一个被称为ABA问题的隐患。ABA问题是指一个值从A变为B,再从B变回A,CAS操作会认为值没有发生变化,从而继续进行更新操作。

2025-02-22 12:28:23 954

原创 Java悲观锁:用‘锁’驯服高并发猛兽

悲观锁基于一种 “悲观” 的思想,它总是假设在任何时刻,对共享资源的访问都极有可能发生冲突。所以,在访问共享资源之前,线程必须先获取锁,以此确保同一时间只有一个线程能够访问该资源。一旦某个线程获取了锁,其他线程若想访问该资源,就只能等待,直到锁被释放。这种策略就如同在做任何事情之前,都先做好最坏的打算,提前采取措施来避免潜在的冲突。Java 中的悲观锁机制,如synchronized关键字、ReentrantLock和ReentrantReadWriteLock,各有其独特的原理和适用场景。

2025-02-22 12:25:11 778

原创 Volatile 关键字在 Java 内存模型中到底扮演了怎样的 “神秘角色”?

Java内存模型(JMM)是Java虚拟机(JVM)规范中定义的一种抽象模型,它规定了多线程程序中变量的访问规则,确保在不同线程之间正确地共享数据。可见性:一个线程对共享变量的修改何时对其他线程可见。有序性:指令执行顺序如何保证在多线程环境下的正确性。原子性:哪些操作是不可分割的。变量可见性是指一个线程对共享变量的修改能够及时被其他线程看到。由于每个线程都有自己的工作内存,线程对变量的修改可能不会立即同步到主内存,从而导致其他线程看不到最新的值。

2025-02-19 22:00:36 667

原创 深入理解Java线程池:原理、使用与最佳实践

线程池是一种多线程处理形式,它维护着多个线程,等待监督管理者分配可并发执行的任务。通过线程池,可以避免频繁创建和销毁线程带来的性能开销,同时可以控制并发线程的数量,防止系统资源被过度消耗。Java线程池是多线程编程中的重要工具,它通过复用线程来减少开销,提高系统的并发性能。通过合理配置线程池参数、监控线程池状态、避免线程泄漏以及及时关闭线程池,开发者可以充分发挥线程池的优势,构建高效、稳定的并发应用程序。希望本文能帮助读者更好地理解和应用Java线程池。如果你有任何问题或建议,欢迎在评论区留言讨论。

2025-02-15 15:39:23 999

原创 设计模式中的六大原则

单一职责原则指出,一个类应该只有一个引起它变化的原因,即一个类只负责一项功能或职责。开闭原则指出,软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这意味着在不修改已有代码的情况下,可以通过添加新代码来实现新的功能。里氏替换原则指出,子类对象能够替换其父类对象,并且程序的行为不会发生改变。换句话说,子类必须能够替代其父类。接口隔离原则指出,客户端不应该被迫依赖于它不使用的接口。也就是说,接口应该是具体的、精简的,而不是庞大而复杂的。依赖倒置原则指出,高层模块不应该依赖于低层模块,二者都应该依赖于抽象。

2025-02-06 21:13:23 768

原创 设计模式之原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而不是通过实例化类的方式。这种模式特别适用于创建复杂对象时,避免重复初始化过程,从而提高性能和效率。在原型模式中,通常会有一个接口 Cloneable 和一个方法 clone(),用于实现对象的浅拷贝或深拷贝。通过这种方式,可以灵活地创建对象的副本,并且可以根据需要进行定制。

2025-02-05 21:20:35 474

原创 设计模式之建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,它允许你逐步构建复杂的对象。建造者模式通过将一个复杂对象的构造过程与其表现分离,使得同样的构造过程可以创建不同的表现形式。这种模式特别适用于需要创建具有多个属性的对象,并且这些属性有些是可选的情况。

2025-02-05 21:04:51 272

原创 设计模式之组合模式

组合模式(Composite Pattern)是一种结构设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和对象组合,从而简化了客户端代码的复杂性。

2025-02-01 16:46:44 421

原创 设计模式之外观模式

外观模式(Facade Pattern)是一种结构设计模式,它为复杂的子系统提供一个统一的接口,使得客户端可以通过这个简化的接口与子系统进行交互,而无需直接操作复杂的内部组件。通过这种方式,外观模式可以降低系统的复杂性,并提高代码的可读性和可维护性。

2025-02-01 16:35:26 429

原创 设计模式之装饰器模式

装饰器模式(Decorator Pattern)是一种结构设计模式,它允许你在不修改原始类的情况下动态地为对象添加新的功能。通过这种方式,装饰器模式可以避免使用继承来扩展功能,并且可以在运行时灵活地组合不同的功能。

2025-02-01 16:24:12 361

原创 设计模式之桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,旨在将抽象部分与实现部分分离,使它们可以独立变化。这种模式通过组合的方式替代继承,从而避免类爆炸问题,并提高系统的灵活性和可扩展性。

2025-02-01 16:09:23 372

原创 设计模式之访问者模式

/ 抽象访问者接口 - 定义了所有具体访问者必须实现的方法// 处理书本// 处理水果// 抽象元素接口 - 定义了接受访问者的方法// 具体元素类 - 书本@Override// 具体元素类 - 水果@Override// 具体访问者类 - 计算总价的访问者@Override@Override。

2025-01-25 16:25:01 778

原创 设计模式之迭代器模式

迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而无需暴露其内部表示。通过使用迭代器模式,我们可以将遍历集合的逻辑从集合本身中分离出来,使得不同的集合可以拥有统一的遍历方式,同时也便于在不修改集合类的情况下添加新的遍历方式。: 提供了一个标准的接口来遍历集合中的元素,无论集合的底层实现如何。: 集合类不需要关心具体的遍历逻辑,只需要提供创建迭代器的方法即可。

2025-01-25 16:09:57 382

原创 设计模式之状态模式

状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变其行为。这种模式将每个状态封装在一个独立的类中,并通过委托机制来动态地改变对象的行为,而无需修改对象本身。状态模式的核心思想是将状态逻辑从对象中分离出来,使得状态的变化和相应的操作更加清晰和易于管理。

2025-01-25 15:25:59 573

原创 设计模式之备忘录模式

备忘录模式(Memento Pattern)属于行为型设计模式,它允许在不破坏对象封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便在需要时能够将对象恢复到之前保存的状态。简单来说,备忘录模式就像是给对象拍了一张 “快照”,记录下对象在某个特定时刻的状态,之后可以随时使用这张 “快照” 将对象恢复到那个时刻的状态。

2025-01-25 14:08:09 842

原创 设计模式之解释器模式

/上下文类-存储解释过程中所需的信息//为变量赋值的方法//查找变量值的方法//抽象表达式接口-定义了解释方法//具体表达式类-变量表达式//构造函数,初始化变量名称@Override//根据上下文查找变量的值//具体表达式类-与操作符表达式//构造函数,初始化左右表达式@Override//解释并返回两个表达式的逻辑与结果//具体表达式类-或操作符表达式//构造函数,初始化左右表达式。

2025-01-18 17:08:48 710

原创 设计模式之享元模式

/ 抽象享元接口 - 定义了所有具体享元必须实现的方法// 具体享元类 - 字符格式化对象// 构造函数,初始化字体名称、大小和颜色@Override// 显示带有特定格式的字符// 享元工厂类 - 负责创建和管理享元对象// 获取指定格式的享元对象,如果不存在则创建一个新的if (!// 假设key是font-name_font-size_color的组合字符串。

2025-01-14 22:03:01 771

原创 设计模式之命令模式

/ 接收者类 - 定义了具体的业务逻辑// 用于保存剪贴板内容if (!} else {// 抽象命令接口// 执行命令// 撤销命令// 具体命令类 - 复制命令@Override@Override// 具体命令类 - 粘贴命令// 记录当前剪贴板内容以便撤销@Override@Override// 恢复到执行前的状态// 调用者类 - 负责触发命令的执行= null) {= null) {

2025-01-13 21:55:55 789

原创 设计模式之中介者模式

/ 定义同事类的接口// 发送消息的方法// 接收消息的方法// 实现具体的同事类 - 用户// 构造函数,初始化用户名称和关联的中介者对象@Override// 用户发送消息时调用中介者的sendMessage方法@Override// 用户接收消息时的行为// 定义中介者接口// 添加用户到聊天室// 发送消息给所有用户(除了发送者自己)// 实现具体的中介者类 - 聊天室@Override// 将用户添加到聊天室列表中@Override。

2025-01-13 21:30:41 242

原创 设计模式之策略模式

/ 定义支付策略接口// 每个具体的支付策略都需要实现的支付方法// 实现信用卡支付的具体策略类@Override// 模拟信用卡支付行为// 实现支付宝支付的具体策略类@Override// 模拟支付宝支付行为。

2025-01-12 22:28:21 451

原创 设计模式之适配器模式

/ 旧接口// 旧接口的实现类@OverrideSystem.out.println("旧方法被调用");// 新接口。

2024-12-26 22:44:40 381

原创 设计模式之观察者模式

首先,定义两个简单的接口:Subject 和 Observer。// Observer.java - 观察者接口// Subject.java - 主题接口。

2024-12-18 09:32:43 423

原创 Guava库的Sets集合工具类应用

Guava 是由 Google 开发的一个开源 Java 库,提供了许多实用的工具和增强的集合类,用于简化 Java 编程。Guava 的集合工具类 Lists、Maps 和 Sets 提供了丰富的方法,极大地扩展了 Java 标准集合框架的功能,使开发者能够更高效地处理集合操作。本文将详细介绍 Guava 库中 Sets工具类的使用方式,并通过具体的 Java 示例代码加以说明。Sets 工具类提供了多种方法,用于简化 Set 的创建和操作,增强 Java 标准集合的功能。

2024-12-15 22:08:08 330

原创 Guava库的Maps集合工具类应用

Guava 是由 Google 开发的一个开源 Java 库,提供了许多实用的工具和增强的集合类,用于简化 Java 编程。Guava 的集合工具类 Lists、Maps 和 Sets 提供了丰富的方法,极大地扩展了 Java 标准集合框架的功能,使开发者能够更高效地处理集合操作。本文将详细介绍 Guava 库中 Maps工具类的使用方式,并通过具体的 Java 示例代码加以说明。Maps 工具类提供了多种方法,用于简化 Map 的创建和操作,增强 Java 标准映射的功能。

2024-12-12 22:44:36 557

原创 Guava库的Lists集合工具类应用

Guava 是由 Google 开发的一个开源 Java 库,提供了许多实用的工具和增强的集合类,用于简化 Java 编程。Guava 的集合工具类 Lists、Maps 和 Sets 提供了丰富的方法,极大地扩展了 Java 标准集合框架的功能,使开发者能够更高效地处理集合操作。本文将详细介绍 Guava 库中 Lists工具类的使用方式,并通过具体的 Java 示例代码加以说明。

2024-12-12 11:11:06 648

原创 Java Stream流工具的常见用法

Stream 是一种序列化的数据流,它不同于传统的集合(如 List 或 Set)。Stream 不存储数据,而是通过管道(pipeline)对数据源(如集合、数组、I/O 频道等)进行操作。中间操作:返回一个新的 Stream,可以链接多个中间操作。这些操作是延迟执行的,直到终止操作触发时才执行。终止操作:生成一个最终结果,如集合、单个值或无返回值(如 forEach)。终止操作会触发所有延迟的中间操作,并关闭流。

2024-12-07 18:29:54 566

原创 设计模式之代理模式

代理模式(Proxy Pattern) 是一种结构型设计模式,它为其他对象提供一个代理,以控制对这个对象的访问。通过代理对象,可以在不改变原对象的情况下,增加或修改其功能。这种模式实现了对象的间接访问,使得客户端与真实对象之间解耦,提高了系统的灵活性和可扩展性。

2024-12-06 09:37:57 715

原创 设计模式之责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,这种模式将多个处理器连成一条链,并沿着这条链传递请求,直到有一个处理器处理它为止。每个处理者只负责处理自己能够处理的请求,如果不能处理,则将请求传递给链中的下一个处理者。

2024-11-30 15:57:06 884

原创 CompletableFuture类和线程安全的集合

CompletableFuture 是 Java 8 引入的一个强大的异步编程工具,位于 java.util.concurrent 包中。它实现了 Future 和 CompletionStage 接口,提供了丰富的 API 来处理异步任务,支持链式调用、组合多个异步任务、异常处理等功能。主要特性异步执行:可以创建异步任务并返回 CompletableFuture 对象。链式调用:支持多个异步任务的链式调用,形成一个异步任务流水线。

2024-11-22 23:45:51 896

原创 设计模式之模板模式

*** 放原料*/System.out.println("倒水");System.out.println("等泡好了凉了再喝");//定义好执行逻辑water();waitCold();// 喝茶子类@OverrideSystem.out.println("放茶叶");// 和咖啡子类@OverrideSystem.out.println("放咖啡粉");

2024-11-16 16:34:14 778

原创 设计模式之工厂模式

工厂模式(Factory Pattern)是一种工作中经常会用到的创建型设计模式,它提供了一种创建对象的方式。将对象的创建和使用分离,把对象创建逻辑封装在工厂类中,而不是在客户端代码中直接实例化对象。这样做的好处是当需要创建新的对象或者修改对象创建逻辑时,只需要在工厂类中进行修改,而不会影响到使用这些对象的其他代码。以上这几种形式的实现复杂度、灵活度各有不同,工作中并不会严格的要求必须采用哪一种,通常会根据具体的使用场景去灵活的组合使用。

2024-11-03 16:54:58 987

原创 设计模式之单例模式

单例模式(Singleton Pattern)是设计模式中的一种创建型模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。

2024-10-27 21:04:01 1183

原创 手写跳表数据结构

跳表 是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树,其功能与性能相当,并且跳表的代码长度相较下更短,其设计思想与链表相似。

2022-06-04 14:39:38 549

原创 设计模式之观察者模式(Observer)

1.开发中的常用场景:聊天室程序的,服务器转发给所有客户端 邮件订阅 Servlet中,监听器的实现 JDK的AWT中事件处理模型,基于观察者模式的委派事件模型(DelegationEventModel) • 事件源----------------目标对象 • 事件监听器------------观察者 京东商城中,群发某商品打折信息2. 核心角色2.1 抽象被观察者角色:  也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主

2022-05-24 22:55:04 239

原创 设计模式之代理模式(Proxy)

代理设计模式主要对方法前后实现增强应用场景1 打印日志2 AOP底层通过代理模式封装3 事务@Transactional 底层AOP4 Mybatis中的mapper接口5 全局捕获异常6 Lcn、Seata、分表分库框架sharding-jdbc 代理数据源7 自定义注解生效8 Rpc远程调用技术(通过dubbo调用接口只会引入接口)代理模式优缺点优点:实现扩展功能、对方法实现增强、安全性、解决代码冗余提高代码复用机制缺点:生成非常多的class文件(代理类)代理模式的

2022-05-24 21:09:52 267

原创 设计模式之工厂模式(Factory)

三种工厂模式的区别模式 说明 简单工厂 用来生产同一等级结构中的任意产品。 (对于增加新的产品,需要修改已有代码) 工厂方法 用来生产同一等级结构中的固定产品。(支持增加任意产品) 抽象工厂 用来生产不同产品族的全部产品。 (对于增加新的产品,无能为力;支持增加产品族) 1.简单工厂模式(又称静态工厂模式)接口定义public interface Game { void run();}Game实现类CFpublic cla

2022-05-23 23:39:54 389

原创 JWT详解

项目中做用户身份验证和系统登录时常常会用到JWT,因此在看了一系列相关的文章后,找到了一篇总结的比较详细的博客,分享给需要的人。内容有点多,就不转载了,直接上链接吧。JWT详解_baobao555#的博客-优快云博客_jwt...

2022-05-15 21:01:02 249

ISD1820录放模块

ISD1820录放模块是一款嵌入式开发应用中的录音播放模块,可用于录制10秒左右的声音,用过与单片机连接控制播放模式,应用广泛,操作方便

2018-09-03

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除