使用场景:final、volatile、ThreadLocal、synchronized、Atomic(自己整理)
锁 | 原理 | 使用场景 |
---|---|---|
final | 实现了Java内存模型的可见性 | 一个变量要被多个线程访问 |
volatile | 实现了Java内存模型的可见性、有序性 | 一个变量要被多个线程访问 |
ThreadLocal | 如果一个变量要被某个线程独享,Java中就没有类似C++中__declspec(thread)这样的关键字,不过还是可以通过java.lang.ThreadLocal类来实现线程本地存储的功能。每一个线程的Thread对象中都有一个ThreadLocalMap对象,这个对象存储了一组以ThreadLocal.threadLocalHashCode为键,以本地线程变量为值的K-V值对,ThreadLocal对象就是当前线程的ThreadLocalMap的访问入口,每一个ThreadLocal对象都包含了一个独一无二的threadLocalHashCode值,使用这个值就可以在线程K-V值对中找回对应的本地线程变量。 | 一个变量要被某个线程独享 |
synchronized | 实现了Java内存模型的原子性、可见性、有序性 | |
Atomic | CAS(《深入理解Java虚拟机(第2版)》第572页) | 一个变量要被多个线程访问 |
Java 内存模型的3个特性:原子性、可见性和有序性,详见:https://www.cnblogs.com/cag2050/p/12409283.html