Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. Quick StartCreate a new post1$ hexo new "My New Post" More info: Writing Run server1$ hexo server More info: Server Generate static files1$ hexo generate More info: Generating Deploy to remote sites1$ hexo deploy More info: Deployment
JMM内存模型
一、Java内存模型(JMM Java memory Model) JMM 是一套规范,规定了“线程本地内存”和“主内存”之间的交互规则,而不必纠结底层实现细节。 Java内存模型定义了主存、工作内存抽象概念,底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等。啥是主存?主存就是所有线程都共享的数据,例如静态变量、成员变量。啥事工作内存?就是每个线程私有的数据,也就是对应的局部变量。 java的内存模型体现在以下几个方面: 原子性:保证指令不会受到线程上下文切换的影响 可见性:保证指令不会受到CPU缓存的影响 有序性:保证指令不会受CPU指令并行优化的影响 可见性首先从一个现象开始说起。下列代码中,main线程对run变量的修改对于线程T是不可见的,这也就导致线程T无法停止: 12345678910111213141516public class VisibilityDemo { private static boolean running = true; public static void main(String[] args) throws...
MySQL一些语法相关
复习一下SQL的语法 一、先讲一讲SQL的分类 DDL (Data Definition Language) 数据定义语言,用来定义数据库对象(数据库,表,字段)。 DML (Data Manipulation Language) 数据操作语言,用来对数据库中的数据进行增删改。 DQL (Data Query Language) 数据查询语言,用来查询数据库中的表记录。 DCL (Data Control Language) 数据控制语言,用来创建数据库用户、控制数据库的访问权限。 OK,讲完了基础分类,下面逐个逐个进行讲解。 二、DDL语句—-数据定义语言,用来定义数据库对象(数据库,表,字段)2.1、数据库生命周期管理(对数据库的增删改)123456789101112-- 创建指定字符集的数据库CREATE DATABASE ecommerce CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 修改数据库配置(MySQL 8.0+)ALTER DATABASE ecommerceCHARACTER SET =...
Thread Local的学习笔记
Thread Local的学习笔记 在多线程编程中,如何安全、简洁地为每个线程维护独立的变量副本,是开发者经常面临的挑战。Java 提供的 ThreadLocal 能够让我们轻松地在不同线程间隔离数据,避免了使用 synchronized 或复杂上下文传递的麻烦。本文将从使用方法、底层实现、常见陷阱与最佳实践几方面,深度剖析 ThreadLocal 的原理与应用,帮助你在日常开发中驾轻就熟地运用它。 一、Thread Local怎么使用? 线程局部变量是一种用于实现线程局部变量的工具类。它允许每个线程都拥有自己的独立副本,从而实现线程隔离。每个线程各用各的 怎么使用Thread Local? 创建Thread Local 12//创建一个ThreadLocal变量public static ThreadLocal<String> localVariable = new ThreadLocal<>(); 设置Thread...
线程池
线程池的基本概述 线程池是一种对线程进行复用和管理的机制。在 Java 中,通过线程池来控制线程的数量和线程的状态,提高线程的执行效率,避免频繁创建和销毁线程带来的资源消耗。就像餐厅的传菜员。餐厅有很多顾客下的订单(任务),而传菜员(线程)负责将菜送到顾客那里。如果每个订单都单独找一个传菜员,会导致传菜员数量过多,餐厅资源紧张。所以餐厅会安排固定的传菜员团队(线程池),他们负责不断地在厨房和顾客之间来回送菜(执行任务),提高服务效率。 线程池的状态 状态转换如图所示: 线程池的简单使用流程简单的使用流程可以总结为:任务提交 → 核心线程执行 → 任务队列缓存 → 非核心线程执行 → 拒绝策略处理第一步,创建线程池。 第二步,调用线程池的 execute()方法,准备执行任务。 如果正在运行的线程数量小于 corePoolSize,那么线程池会创建一个新的线程来执行这个任务; 如果正在运行的线程数量大于或等于 corePoolSize,那么线程池会将这个任务放入等待队列; 如果等待队列满了,而且正在运行的线程数量小于...
java的🔒(未完待续)
还没写完呢在这之前先补充一些知识吧,方便后续相关知识的理解 一、内存中的对象长什么样子? 一张图说清楚吧。 堆中的java对象只有数据部分,对象中的数据含义,要结合方法区中的class才能明了。 堆中的对象结构包括三部分:对象头、实例数据、填充数据。这里主要是见一下对象头部分,对象头可以说是一个对象的身份证了。 对象头的构成如下: 1234+------------------+------------------+------------------+------------------+| Mark Word | Klass Pointer | [Array Length] | Instance Data | +------------------+------------------+------------------+------------------+| 64 bits | 32/64 bits | 32 bits | variable ...
MySQL事务管理
一、 MySQL 事务生命周期概览 1.1、总体概览 1. **开始事务**:通过 `BEGIN`、`START TRANSACTION` 或 `SET autocommit = 0` 开启事务 2. **执行 DML 操作**:执行多条数据修改语句(如 `INSERT`、`UPDATE`、`DELETE`) 3. **日志记录**:InnoDB 会分别写入 Undo Log(用于回滚)与 Redo Log(用于崩溃恢复) 4. **提交或回滚**: - `COMMIT`:写入 Redo Log 并刷新磁盘,正式提交 - `ROLLBACK`:读取 Undo Log,撤销所有操作 5. **崩溃恢复(异常场景)**:系统崩溃时,InnoDB 启动后通过 Redo Log 重做已提交事务、通过 Undo Log 回滚未提交事务 1.2、事务隔离级别 1.2.1、什么是读未提交? - 这是最低的事务隔离级别。在这个级别下,一个事务可以看到其他事务未提交的更改。例如,假设在银行系统中,用户 A 查看自己账户余额,此时用户 B...