自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 收藏
  • 关注

原创 TypeScript学习笔记(全)

本文概述了TypeScript的基本类型系统,包括但不限于原始类型(如string、number、boolean)、数组、元组、枚举以及任意类型(any),强调了类型注解在提升代码质量方面的作用。探讨了类与接口的使用,如何通过类的继承、接口的实现来促进代码复用与结构化设计。介绍了泛型的概念与应用,文章还涉及了高级主题,如类型推断、类型别名、装饰器的使用,以及如何利用模块和命名空间组织提升项目的可管理性。

2024-06-30 06:20:41 651

原创 【Spring Boot 3】的安全防线:整合 【Spring Security 6】

探索如何将Spring Boot 3与Spring Security 6完美融合,为您的应用程序打造坚实的安全防线。本文深入剖析整合过程,从基础概念到高级特性,为您呈现全面的安全解决方案。无论您是初学者还是经验丰富的开发者,都能在本文中获得宝贵的见解。学习如何配置用户认证、授权和密码加密,掌握基于注解的安全性高级功能。通过清晰的示例和实用的指导,本文将帮助您提升应用程序的安全性,保护您的数据免受威胁。立即开始,构建一个安全可靠的Spring Boot应用!

2024-03-02 19:48:05 6228 19

原创 探索【注解】、【反射】、【动态代理】,深入掌握高级 Java 开发技术

本文将带领读者深入了解 Spring 框架中的关键技术:注解、反射和动态代理。注解作为一种元数据,大幅简化了 Spring 应用程序的配置和管理。反射机制赋予了程序在运行时动态获取和操作类信息的能力,为 Spring 提供了高度灵活性。而动态代理则是 Spring AOP 的基础,通过代理模式实现了横切关注点的管理。本文旨在帮助读者深入理解这些关键概念,提升其对 Spring 框架的掌握程度,从而更加熟练地运用 Java 开发技术。

2024-02-17 21:14:48 1617 4

原创 RabbitMQ入门到实践-01Linux两种安装Rabbit的方式

首先我们学习的RabbitMQ,需要对其进行安装。推荐安装在Linux系统中,下面提供安装的两种方式一:使用Dcoker安装(安装更为简便)以下代码仅供参考#1:下载镜像 本次选择安装的为3.7.15版本docker pull rabbitmq:3.7.15#2:使用docker命令创建容器并映射对应端口(如果是服务器需要开放对应的端口)docker run -d --name...

2019-09-21 12:02:25 2208 1

原创 Nginx入门到实战—01在Linux中用Docker方式安装Nginx

什么是NginxNginx(engine x) 是一个高性能的HTTP和反向代理服务器,同时Nginx是一款轻量级的Web服务器。安装:我们本次采用docker的方式进行安装Nginx首先确定自己的虚拟机是否安装Docker(如果未安装下面提供安装步骤示例-仅供参考)安装docker虚拟机系统为CentOS7#首先确保自己的yum更新到最新yum update...

2019-09-17 13:12:14 1878

原创 TypeScript核心类型概览与应用-1

TypeScript 是一种由微软开发的开源编程语言,它是JavaScript的一个超集,也就是说任何有效的JavaScript代码也是有效的TypeScript代码。TypeScript在JavaScript的基础上添加了静态类型定义、类、接口、命名空间等特性,旨在解决JavaScript在大型应用开发中遇到的可维护性、可扩展性和编译时错误检查等问题。TypeScript简介静态类型检查:TypeScript 引入了静态类型系统,允许开发者在编码阶段就发现类型错误,而不是等到运行时。

2024-06-04 07:26:07 1025

原创 25. 悲观锁 和 乐观锁

悲观锁与乐观锁是管理并发冲突的两种策略。悲观锁假定冲突频繁发生,通过加锁阻止其他事务访问数据,确保数据一致性但可能降低并发性能。乐观锁则假设数据冲突较少,读取时不加锁,更新时验证数据版本,减少锁竞争提高并发度,但在高冲突场景下可能需重试操作。两者各有利弊,适用于不同并发控制需求。

2024-06-01 07:28:25 750

原创 24.显式锁-ReentrantLock

显式锁作为Java并发编程领域的一项进阶同步技术,相较于传统的synchronized关键字,在灵活性与控制精细度上实现了显著提升。它在Java的并发编程java.util.concurrent.locks中,通过标准化的Lock接口及其强大实现类——如ReentrantLock,为开发人员构建了一套丰富多维的同步工具集,深度赋能并发控制策略的定制与优化。ReentrantLock等实现不仅沿袭了基本的互斥访问控制,还引入了诸如可重入性、公平性配置、锁中断、以及读写分离等高级特性。

2024-05-31 06:42:31 839

原创 23.显式锁-ReentrantLock

想要在并发编程的战场上所向披靡?深入了解ReentrantLock,开启高效同步的新纪元,让你的代码在多线程世界里如虎添翼。点击了解更多,让我们一起探索ReentrantLock那未被完全揭开的神秘面纱!ReentrantLock,作为Java并发包中的一员,是实现锁机制的重量级工具,相较于synchronized关键字,提供了更高的灵活性和可控性。该锁支持公平与非公平两种锁获取模式,允许线程重复获取同一把锁,并要求按相同次数释放,确保了锁的可重入性。

2024-05-30 07:27:57 902

原创 22.Volatile原理

Volatile关键字在Java中扮演着确保变量可见性与禁止指令重排序的关键角色,它是实现线程安全轻量级同步的一种方式。通过volatile修饰的变量,任何对其的修改都会立即写回主内存,同时其他线程对这一变量的访问总是能获取到最新值,从而避免了缓存一致性问题。这使得volatile在某些特定场景,如状态标记、双重检查锁定等模式中极为有用。尽管volatile能保证可见性,但并不意味着它能替代所有的同步需求。它不能保证原子性操作,下面我一起来了解一下volatile原理。

2024-05-29 06:57:37 1027 2

原创 显式锁的分类

显式锁作为并发编程中的核心组件,为开发者提供了比内置锁(如synchronized)更灵活的控制手段。从不同维度划分,显式锁展现出多种类型,满足多样化的并发控制需求。首先,可重入锁与不可重入锁区分了锁能否被同一线程多次获取而不引发死锁。悲观锁与乐观锁代表了对并发冲突的不同处理哲学,前者假定冲突普遍存在故提前加锁,后者则假设冲突较少,仅在提交修改时验证数据版本。共享锁与独占锁界定了资源访问模式,前者允许多个读取者共享资源,后者确保每次只有一个访问者。

2024-05-26 22:08:30 520

原创 21.Happens-Before原则

本文深入探讨了"Happens-Before"规则的核心概念,列举了六种保证操作间顺序的关键场景,包括程序顺序规则、监视器锁规则、volatile变量规则、线程启动规则、线程终结规则及传递性规则。例如,监视器锁规则确保了对一个锁的解锁操作happens-before于随后对同一锁的加锁操作,这直接关联到synchronized代码块或方法的内存效果,保障了数据的同步更新。

2024-05-26 08:47:40 715

原创 20.有序性与内存屏障

对于现在CPU来说,在CPU内核 和 主存之间都具备一个高速缓存,高速缓存主要为了减少CPU内核 和主存之间的交互,在CPU内核进行读操作时,也是先从高速缓存中读取,在CPU内核写的时候,也是先写入高速缓存,最后统一写入主存。读屏障是将高速缓存中相应的数据失效,在指令前插入读屏障,可以让高速缓存中的数据失效,强制重新从主存中加载数据,并且读屏障会告诉CPU和编译器,后于这个屏障的读指令必须后执行,不能对后面的读操作进行指令重排。写屏障的插入不仅会将数据同步到主存,还会阻止编译器和CPU对写操作进行重排序。

2024-05-25 04:57:09 710

原创 19.硬件层的MESI协议原理

MESI协议,全称为Modified, Exclusive, Shared, Invalid,是一种用于维护缓存一致性的重要协议,广泛应用于多处理器系统中。该协议确保了每个处理器的高速缓存与主内存中的数据保持一致,通过四个状态来标记缓存行(cache line)的状态:Modified(已修改)、Exclusive(独占)、Shared(共享)和Invalid(无效)。

2024-05-24 08:29:44 1088

原创 18.并发编程原子性、可见性、有序性原理

在并发编程的领域里,原子性、有序性和可见性是构建高效、正确并发系统不可或缺的三大基石。本文深入浅出地探讨了这三个核心概念,揭示它们如何共同支撑起多线程环境下程序的可靠执行。

2024-05-22 06:47:20 793

原创 HandlerMethodArgumentResolver用法

HandlerMethodArgumentResolver 是Spring MVC框架中的一个核心接口,它扮演着数据绑定和类型转换的重要角色,负责处理控制器方法参数的解析与注入。这一机制极大地增强了Spring框架处理HTTP请求的灵活性和便捷性,允许开发者自定义参数解析逻辑,以支持复杂类型、自定义注解或从请求中提取特定信息。

2024-05-18 08:29:32 2612

原创 17.高并发场景下CAS效率的优化

LongAdder的基本思路就是分散热点,将value值分散到一个数组中,不同线程会命中不同槽中的元素,每个线程只能对自己槽中的那个值进行CAS操作,这样热点就被分散了,冲突的概率就小很多了。LongAdder的实现思路其实和CurrentHashMap中分段使用的原理非常相似,本质上都是不同的线程,在不同的单元上进行操作,减少了线程的竞争,提高了并发的效率。总的来说,LongAdder 的设计思路清晰,将累加操作分解成多个独立的单元,通过分段累加和并行计算提高了在高并发情况下的性能表现。

2024-05-16 07:19:47 1126

原创 16.ABA问题

ABA问题是指在并发编程中,由于CAS(比较并交换)操作的特性,可能出现的一种问题。CAS是一种乐观锁机制,用于实现多线程环境下的原子操作。期望值更新值和当前值。CAS操作会比较当前值和期望值,如果相等,则将当前值更新为新值,否则不进行任何操作。CAS操作的局限性导致了ABA问题的出现。并发场景下的共享变量修改:多个线程同时对一个共享变量进行修改和操作。CAS操作的原子性:CAS操作只能检查共享变量当前的值是否和预期值相等,并在相等时才进行更新操作。

2024-05-15 12:43:40 1019 1

原创 15.JUC原子类

基础原子类(以AtomicInteger为例),主要是通过CAS自旋 + volatile相结合的方案实现,既保证了变量操作线程的原子性,有避免了synchronized重量级锁的开销,使得Java程序的效率得到大幅度提升。基础原子类型 只能保证一个变量的原子操作,但是当需要对多个变量操作时,CAS无法保证原子性操作,这个时候可以使用AtomicReference(原子引用类型),保证对象引用的原子性。属性更新原子类是Java并发包提供的一组类,用于原子性地更新对象中的属性值。

2024-05-14 08:02:55 975

原创 14.CAS原理

JDK 5 所增加的 JUC(java.util.concurrent)并发包对操作系统的底层的CAS原子操作进行了封装,为上层Java程序提供了CAS操作的APICAS(Compare and Swap)是一种并发编程中的原子操作,用于实现多线程环境下的无锁同步。内存位置(或者说是要操作的变量的引用)、期望值和新值。首先,读取内存位置的当前值,这是期望值。然后,将期望值与内存位置的当前值进行比较。如果相等,则说明内存位置的值没有被其他线程修改,可以进行更新操作。

2024-05-13 06:50:36 1024

原创 13.重量级锁原理及其实战

这篇文章深入探讨了重量级锁的核心原理及其在JVM中的实现细节。重量级锁通过监视器来保护临界区代码,确保在任何时刻只有一个线程可以进入临界区执行。文章详细解释了监视器的特点,如同步、协作、信号机制等,并介绍了在JVM中监视器是如何通过ObjectMonitor类来实现的,以及该类的关键属性和作用。其中,_cxq、_WaitSet、_EntryList等队列被用来存放等待获取监视器锁的线程,而_owner变量则记录了当前持有该监视器的线程。通过分析这些细节,读者可以更深入地理解重量级锁的工作原理和实现机制。

2024-05-10 07:07:45 1012

原创 12.轻量级锁原理及其实战

引入轻量级锁的主要目的是在多线程环境竞争不激烈的情况下, 通过CAS机制竞争锁减少重量级锁的产生的性能损耗,重量级锁使用了操作系统底层的互斥锁,会导致线程在用户态和核心态之间频繁切换,从而带来较大的性能损耗。因为内置锁对象的Mark Word的结构会有所变化,Mark Word将会出现一个指向锁记录的指针,而不再存在无锁状态下的锁的哈希码等信息,所以必须将这些信息暂存起来,供后面锁释放的时候使用。轻量级锁膨胀是指在使用轻量级锁的过程中,如果锁竞争激烈或者存在其他特定情况,JVM会将轻量级锁膨胀为重量级锁。

2024-05-09 07:20:19 1202

原创 11.偏向锁原理及其实战

偏向锁是Java虚拟机(JVM)为了优化无竞争情况下的锁性能而引入的机制。当一个线程获取了对象的锁时,JVM会将该对象标记为偏向锁状态,并记录获取锁的线程ID。在无竞争情况下,线程再次获取锁时无需竞争,直接进入同步代码块,提高程序性能。然而,偏向锁引入了记录线程ID和CAS操作的开销,因此JVM会延迟启用偏向锁。偏向锁并不适用于有竞争的情况,会自动升级为轻量级锁或重量级锁以保证线程的互斥访问和数据一致性。

2024-05-08 11:51:56 746

原创 10.Java对象内置结构

这篇文章详细介绍了Java对象的内置结构,分为对象头、对象体和对齐字节三个部分。对象头包括标记字、类指针和数组长度等字段,用于存储对象的元数据和状态信息。对象体则包含实例变量,用于存储对象的属性值。对齐字节则是为了优化内存访问效率而添加的额外字节,确保对象在内存中对齐。文章还介绍了对象结构中核心字段的作用,包括标记字、类指针、数组长度等。最后,通过图示和解释说明了Mark Word的结构信息,以及使用JOL工具查看对象布局的方法。这篇文章总结了Java对象内置结构的关键概念和机制,适合Java开发者深入了解

2024-05-07 07:27:06 898

原创 9.Java内置锁的核心原理-Synchronized

本文深入探讨了Java内置锁(Synchronized)的核心原理。首先介绍了内置锁的基本概念,包括互斥性、可重入性、等待与通知机制以及内存可见性。然后详细解释了对象监视器、互斥性、可重入性、等待与通知机制以及内存可见性等方面的实现原理。最后,阐述了使用synchronized关键字修饰代码块或方法时的行为,以及线程在获取锁后执行被保护代码的流程。通过这些内容,读者能够深入理解Java内置锁的工作机制,从而更好地编写线程安全的Java代码。

2024-05-06 07:17:25 960 2

原创 8.Java并发编程—ThreadLocal,TreadLocalMap,InheritableThreadLocal,TransmittableThreadLocal使用指南

本文带深入探讨 ThreadLocal、ThreadLocalMap、InheritableThreadLocal 和 TransmittableThreadLocal 的详细使用。介绍了 ThreadLocal 的作用和原理,并提供了基本使用方法。随后,对 ThreadLocalMap 进行了深度解析,包括内部结构、工作原理和增删改查操作。接着,讨论了 InheritableThreadLocal 在线程继承中的应用和特性,以及 TransmittableThreadLocal 在线程池和异步调用。

2024-03-27 23:04:11 1030 2

原创 7.Java并发编程—掌握线程池的标准创建方式和优雅关闭技巧,提升任务调度效率

本文详细介绍了线程池的标准创建方式和参数设置,包括核心线程数、最大线程数和阻塞队列的选择。同时,探讨了向线程池提交任务的两种方式:execute()和submit()。通过案例演示,展示了如何使用这两种方法来提交任务。此外,文章还介绍了线程池的任务调度流程,包括ThreadFactory的源码解析和自定义简单线程工厂的实现方式。对于任务阻塞队列和线程池的拒绝策略也进行了解析,并提供了优雅关闭线程池的方法。最后,通过测试案例验证了限时等待和等待全部任务执行完毕两种关闭线程池的技巧,帮助读者更好地掌握线程池。

2024-03-24 20:21:33 989 1

原创 6.Java并发编程—深入剖析Java Executors:探索创建线程的5种神奇方式

本文深入剖析了Java中使用Executors类创建线程的5种方式。这些方式包括newSingleThreadExecutor()、newFixedThreadPool(int nThreads)、newCachedThreadPool()、newScheduledThreadPool(int corePoolSize)和newWorkStealingPool(int parallelism)。每种方式都具有独特的特点和适用场景。通过了解这些线程池的工作原理和适用性,我们可以根据实际需求选择最合适的线程池类

2024-03-13 21:58:37 440 2

原创 5.Java并发编程—JUC线程池架构

Java并发编程中的JUC(Java Util Concurrent)线程池架构是一种强大的工具,用于管理和调度多个线程执行任务。该架构提供了一种高效、可扩展的方式来处理并发任务。JUC线程池架构的核心组件包括线程池Executor、工作线程Worker和任务队列BlockingQueue。Executor是线程池的主要入口,它接收任务并将其提交给线程池进行执行。Worker线程负责执行任务的实际逻辑,通过从任务队列中获取任务并执行。任务队列是一个缓冲区,用于存储待执行的任务。

2024-03-12 22:19:31 1383

原创 Java线程的基本操作

线程基本操作包括sleep、interrupted、join、yield等。sleep用于使线程暂停一段时间,通常用于模拟等待或者定时任务。interrupted用于检查线程是否被中断,可以帮助线程处理中断请求。join用于等待线程执行完成,主要用于协调多个线程的执行顺序。yield让出当前线程的执行权,让其他线程有机会执行,有助于提高线程执行的公平性。这些操作都是多线程编程中常用的基本操作,能够帮助程序员控制线程的执行顺序和行为,确保线程之间的协作和同步。

2024-03-12 00:14:30 1166

原创 深入理解Java线程执行原理

在学习线程的核心原理之前,我们先来了解一下 线程的调度 和执行在Java中,线程调度与执行是指Java虚拟机(JVM)根据一定的调度算法和优先级来决定哪个线程在特定时刻执行。线程调度是多线程并发执行的关键部分,它决定了线程在CPU上执行的顺序和时间片分配。

2024-03-09 10:21:55 1296

原创 Java并发编程-实现多线程的四种方式

在Java中,有四种常见的创建线程的方式:继承Thread类、实现Runnable接口、实现Callable接口配合Future和ExecutorService、以及使用Executor框架。每种方式都有自己的优缺点和适用场景。继承Thread类简单直接,但限制了类的继承层次结构;实现Runnable接口避免了单继承的限制,提高了灵活性;实现Callable接口可以获取任务执行结果和控制线程数量,但相对繁琐;使用Executor框架提供了高度灵活的线程管理和任务调度功能,但需要合理配置以避免资源浪费。选择合

2024-03-07 22:04:59 1170

原创 从零开始学习Netty - 学习笔记 -Netty入门【自定义编码器解码器】

在Netty中,自定义编码器和解码器是网络应用程序中关键的组件之一。通过自定义编码器和解码器,可以实现将对象转换为字节流(编码)和将字节流转换为对象(解码)的过程。这样的功能对于网络通信中的数据序列化和反序列化至关重要。Netty提供了丰富的API和抽象类来简化自定义编码器和解码器的开发过程。编码器负责将应用程序的数据转换为网络传输的数据,而解码器则负责从网络传输的数据中提取出应用程序的数据。通过合理设计和实现自定义编码器和解码器,可以提高网络应用程序的性能和可靠性。

2024-03-05 23:38:00 898

原创 Java并发编程-进程和线程

进程和线程是计算机科学中重要的概念,用于管理程序的执行和资源分配。进程是操作系统中的一个独立执行单位,拥有自己的内存空间和系统资源。每个进程都可以包含一个或多个线程,线程是进程内的实际执行单元,共享相同的内存空间和资源。本文简要介绍了进程和线程的概念、特点以及它们在计算机系统中的作用。进程和线程的使用使得程序能够并发执行,提高了系统的效率和性能。然而,进程和线程的管理也面临着诸多挑战,如资源竞争、死锁等问题。因此,合理地使用和管理进程与线程对于保障系统稳定运行和提升性能至关重要。

2024-03-05 21:32:03 750

原创 LeetCode刷题-206.反转链表【递归实现】

LeetCode刷题,第206题,反转链表。给你单链表的头节点head,请你反转链表,并返回反转后的链表。

2024-03-04 22:41:20 295

原创 从零开始学习Netty - 学习笔记 -Netty入门【协议设计和解析】

在计算机中,协议是指一组规则和约定,用于在不同的计算机系统之间进行通信和数据交换。计算机协议定义了数据传输的格式、顺序、错误检测和纠正方法,以及参与通信的各个实体的角色和责任。计算机协议可以在各种不同的层次上操作,包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

2024-03-04 22:19:23 1119

原创 设计模式—命令模式:探索【命令模式】的奥秘与应用实践!

命令模式是一种行为设计模式,旨在将请求封装成独立的对象,使得发送者和接收者之间解耦。该模式由命令、接收者、调用者和客户端组成。命令对象封装了请求的细节,接收者执行实际操作,调用者将命令发送给接收者。命令模式有助于实现撤销、重做、日志记录等功能,并支持将多个命令组合成复杂命令。然而,命令模式可能导致类爆炸和命令逻辑混乱。在Java中,命令模式常用于撤销/重做功能、任务队列和菜单操作等场景。优秀的命令模式实现应注重接口设计、合理使用抽象类、选择适当的命令实现方式,并考虑多线程环境下的线程安全性。

2024-03-03 19:36:30 828

原创 从零开始学习Netty - 学习笔记 -Netty入门【半包,黏包】

Netty是一款高性能的网络通信框架,但面临黏包与半包等问题。黏包指发送方多个消息合并成一个,半包是指接收方无法完整读取一个消息。Netty通过粘包拆包机制解决这些问题。解决黏包可通过消息长度前缀、特殊符号分隔消息、固定长度消息等方式。解决半包可采用消息长度字段、消息边界、消息头包含消息体长度等方式。Netty提供编解码器、DelimiterBasedFrameDecoder、LengthFieldBasedFrameDecoder等工具帮助处理这些问题,确保数据准确传输。

2024-03-03 19:26:02 845

原创 Linux搭建SFTP服务器

最简单,最实用的Linux搭建SFTP教程。SFTP(SSH文件传输协议)是一种安全的文件传输协议,用于在计算机之间传输文件。它基于SSH(安全外壳协议)的子系统,提供了加密的、可靠的数据传输通道,用于在客户端和服务器之间安全地传输文件。

2024-03-02 19:34:14 3471

原创 SpringBoot 整合WebService

SOAP Web服务:基于SOAP(Simple Object Access Protocol)协议的Web服务。SOAP是一种用于交换结构化信息的协议,它使用XML作为消息格式,并通常通过HTTP协议进行传输。RESTful Web服务:基于REST(Representational State Transfer)原则的Web服务。RESTful服务使用标准的HTTP方法(如GET、POST、PUT、DELETE)来执行操作,并通常返回JSON或XML格式的数据。

2024-03-01 22:28:45 3490 4

空空如也

空空如也

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

TA关注的人

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