Thread Local的学习笔记
Thread Local的学习笔记 在多线程编程中,如何安全、简洁地为每个线程维护独立的变量副本,是开发者经常面临的挑战。Java 提供的 ThreadLocal 能够让我们轻松地在不同线程间隔离数据,避免了使用 synchronized 或复杂上下文传递的麻烦。本文将从使用方法、底层实现、常见陷阱与最佳实践几方面,深度剖析 ThreadLocal 的原理与应用,帮助你在日常开发中驾轻就熟地运用它。 一、Thread Local怎么使用? 线程局部变量是一种用于实现线程局部变量的工具类。它允许每个线程都拥有自己的独立副本,从而实现线程隔离。每个线程各用各的 怎么使用Thread Local? 创建Thread Local 12//创建一个ThreadLocal变量public static ThreadLocal<String> localVariable = new ThreadLocal<>(); 设置Thread...
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...
线程池
线程池的基本概述 线程池是一种对线程进行复用和管理的机制。在 Java 中,通过线程池来控制线程的数量和线程的状态,提高线程的执行效率,避免频繁创建和销毁线程带来的资源消耗。就像餐厅的传菜员。餐厅有很多顾客下的订单(任务),而传菜员(线程)负责将菜送到顾客那里。如果每个订单都单独找一个传菜员,会导致传菜员数量过多,餐厅资源紧张。所以餐厅会安排固定的传菜员团队(线程池),他们负责不断地在厨房和顾客之间来回送菜(执行任务),提高服务效率。 线程池的状态 状态转换如图所示: 线程池的简单使用流程简单的使用流程可以总结为:任务提交 → 核心线程执行 → 任务队列缓存 → 非核心线程执行 → 拒绝策略处理第一步,创建线程池。 第二步,调用线程池的 execute()方法,准备执行任务。 如果正在运行的线程数量小于 corePoolSize,那么线程池会创建一个新的线程来执行这个任务; 如果正在运行的线程数量大于或等于 corePoolSize,那么线程池会将这个任务放入等待队列; 如果等待队列满了,而且正在运行的线程数量小于...