简述Java内存模型和ThreadLocal与之关系

本文为个人理解,如有错误请及时指正, 谢谢


Java内存模型

Java内存模型即Java Memory Model,简称JMM。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。

ThreadLocal

ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。

为什么ThreadLocal存储的值不会影响共享变量呢?

在java内存模型中, 线程与内存中的变量关系是这样的
简述Java内存模型和ThreadLocal与之关系_第1张图片
JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。

ThreadLocal在图中起到什么作用

假如多个线程共享一个共享变量, 线程访问共享变量的时候是先将共享变量拷贝到自己的本地内存, 再从本地内存中读取. ThreadLocal就是如此, 将ThreadLocal中存储的变量保存到了本地内存之中, 所以对ThreadLocal变量的访问不涉及主内存, 操作的是本地变量中存储的主内存中共享变量的副本.

你可能感兴趣的:(javaSE)