读写锁&邮戳锁

读写锁:资源能够被多个读线程访问,或者被一个写线程访问,但是不能同时存在读写线程。
StampedLock:采取乐观获取读锁,获取读锁之后其他线程再尝试获取写锁时不会被阻塞,这其实是对读锁的优化。使用乐观读锁模式可以提高吞吐量
AQS原理

AbstractQueuedSynchronizer(抽象的队列同步器,简称AQS)
是用来实现锁或者其它同步器组件的公共基础部分的抽象实现,
是重量级基础框架及整个JUC体系的基石,主要用于解决锁分配给"谁"的问题
Java对象内存布局及Synchronized锁升级
锁的升级过程无锁-偏向锁-轻量级锁-重量级锁

在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:
- 对象头
- 实例数据
- 对齐填充
ThreadLocal基础及源码分析

ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法)都有自己的、独立初始化的变量副本。 ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态(例如,用户ID或事务ID)与线程关联起来。
CAS与原子操作类

CAS基本知识
compare and swap的缩写,中文翻译成比较并交换,实现并发算法时常用到的一种技术。它包含三个操作数——内存位置、预期原值及更新值。
执行CAS操作的时候,将内存位置的值与预期原值比较:
- 如果相匹配,那么处理器会自动将该位置值更新为新值,
- 如果不匹配,处理器不做任何操作,多个线程同时执行CAS操作只有一个会成功。
Java内存模型JMM与volatile

- JMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念并不真实存在它仅仅描述的是一组约定或规范,通过这组规范定义了程序中(尤其是多线程)各个变量的读写访问方式并决定一个线程对共享变量的写入何时以及如何变成对另一个线程可见,关键技术点都是围绕多线程的原子性、可见性和有序性展开的。
- 原则: JMM的关键技术点都是围绕多线程的原子性、可见性和有序性展开的
- 能干嘛?
- 通过JMM来实现线程和主内存之间的抽象关系。
- 屏蔽各个硬件平台和操作系统的内存访问差异以实现让Java程序在各种平台下都能达到一致的内存访问效果。
CompletableFuture基本使用

Future和Callable接口 Future接口(FutureTask实现类)定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。(异步:可以被叫停,可以被取消) 一句话:Future接口可以为主线程开一个分支任务,专门为主线程处理耗时和费力的复杂业务。 eg.比如主线程让一个子…
操作系统

- 操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序,是计算机的基石。
- 操作系统本质上是一个运行在计算机上的软件程序 ,用于管理计算机硬件和软件资源。 举例:运行在你电脑上的所有应用程序都通过操作系统来调用系统内存以及磁盘等等硬件。
- 操作系统存在屏蔽了硬件层的复杂性。 操作系统就像是硬件使用的负责人,统筹着各种相关事项。
- 操作系统的内核(Kernel)是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。 内核是连接应用程序和硬件的桥梁,决定着系统的性能和稳定性。
CSAPP笔记

1、计算机系统漫游 信息就是位+上下文 整个计算机系统中的所有信息都可以用一串比特串的形式表示,区分不同的数据对象的唯一方法就是我们读到的这些对象时的上下文(context) 程序被其他程序翻译成不同的格式 一个高级语言写的程序(这里以C语言为例),从源代码到最终的机器中的可执行文件会经过一下几个阶段: 预处理阶段,处理源码的中的预处理语句(比如说…
Nginx入门

Nginx是一款轻量级的Web服务器,可以用作反向代理服务器、负载均衡器和HTTP缓存服务器
JVM类加载子系统

在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。
类加载器是JVM执行类加载机制的前提。
JVM字节码指令集

Java字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令。
Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(操作数,Operands)而构成。由于Java虚拟机采用面向操作数栈而不是寄存器的结构,所以大多数的指令都不包含操作数,只有一个操作码。
JVM垃圾回收

当需要排查各种内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节
JVM执行引擎

执行引擎是Java虚拟机核心的组成部分之一。
“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。
JVM内存模型

对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。
Docker构建jdk19镜像部署qqbot项目

docker自定义jdk19镜像
并部署jdk19的springboot项目qqbot
宝宝都能看懂的虚拟线程原理及实战

理论 简介 虚拟线程具有和 Go 语言的 goroutines 和 Erlang 语言的进程类似的实现方式,它们是用户模式(user-mode)线程的一种形式。 在过去 Java 中常常使用线程池来进行平台线程的共享以提高对计算机硬件的使用率,但在这种异步风格中,请求的每个阶段可能在不同的线程上执行,每个线程以交错的方式运行属于不同请求的阶段,与 …
Java高并发革命!JDK19新特性——虚拟线程(Virtual Threads)
Mirai机器人异步上传Minio

虚拟线程具有和 Go 语言的 goroutines 和 Erlang 语言的进程类似的实现方式,它们是用户模式(user-mode)线程的一种形式。
在过去 Java 中常常使用线程池来进行平台线程的共享以提高对计算机硬件的使用率,但在这种异步风格中,请求的每个阶段可能在不同的线程上执行,每个线程以交错的方式运行属于不同请求的阶段,与 Java 平台的设计不协调从而导致:
- 堆栈跟踪不提供可用的上下文
- 调试器不能单步执行请求处理逻辑
- 分析器不能将操作的成本与其调用方关联。
而虚拟线程既保持与平台的设计兼容,同时又能最佳地利用硬件从而不影响可伸缩性。虚拟线程是由 JDK 而非操作系统提供的线程的轻量级实现:
- 虚拟线程是没有绑定到特定操作系统线程的线程。
- 平台线程是以传统方式实现的线程,作为围绕操作系统线程的简单包装。
需求:在发送消息的同时将图片上传到Minio,从而提高bot响应性能 代码如下: 线程池配置类 package com.example.qqbot.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotat…
Leetcode每日一题(持续更新中)
持续更新leetcode每日一题题解