diff --git a/notes/Java 并发.md b/notes/Java 并发.md index d02285ef..0378db64 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -692,6 +692,11 @@ ABA :如果一个变量 V 初次读取的时候是 A 值,它的值被改成 Java 语言中,如果一个变量要被多线程访问,可以使用 volatile 关键字声明它为“易变的”;如果一个变量要被某个线程独享,Java 中就没有类似 C++中 \_\_declspec(thread)这样的关键字,不过还是可以通过 java.lang.ThreadLocal 类来实现线程本地存储的功能。每一个线程的 Thread 对象中都有一个 ThreadLocalMap 对象,这个对象存储了一组以 ThreadLocal.threadLocalHashCode 为键,以本地线程变量为值的 K-V 值对,ThreadLocal 对象就是当前线程的 ThreadLocalMap 的访问入口,每一个 ThreadLocal 对象都包含了一个独一无二的 threadLocalHashCode 值,使用这个值就可以在线程 K-V 值对中找回对应的本地线程变量。 +- ThreadLocal注意事项 + - `ThreadLocal`从理论上讲并不是用来解决多线程并发问题的,因为根本不存在多线程竞争。 + - 尽可能在每次使用`ThreadLocal`后手动调用`remove()`,以避免出现`ThreadLocal`经典的内存泄漏甚至是造成自身业务混乱的风险。 + - 在一些场景(尤其是使用线程池)下,由于`ThreadLocal.ThreadLocalMap`的底层数据结构导致ThreadLocal有内存泄漏的情况 + ## 锁优化 高效并发是从 JDK 1.5 到 JDK 1.6 的一个重要改进,HotSpot 虚拟机开发团队在这个版本上花费了大量的精力去实现各种锁优化技术,如适应性自旋(Adaptive Spinning)、锁消除(Lock Elimination)、锁粗化(Lock Coarsening)、轻量级锁(Lightweight Locking)和偏向锁(Biased Locking)等。这些技术都是为了在线程之间更高效地共享数据,以及解决竞争问题,从而提高程序的执行效率。