ThreadLocal和InheritableThreadLocal是基于在Thread里边的两个变量实现的,这两个变量类似于一个HashMap的结构ThreadLocalMap,里边的Entry key为ThreadLocal, value为你存的值. InheritableThreadLocal的实现主要是在线程创建的时候,如果父线程有inheritableThreadLocal, 会被拷贝到子线程。
原子类一个简单的i++操作, 多线程环境下如果i是共享的,这个操作就不是原子的。
为此,java.util.concurrent.atomic这个包下边提供了一些原子类,这些原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。
一个使用的例子 public class Demo_04_01_1_Atomic { static class Counter { private AtomicInteger atomicInteger = new AtomicInteger(0); public int increment() { return atomicInteger.getAndIncrement(); } public int get() { return atomicInteger.get(); } } static class Counter2 { private int value = 0; public int increment() { return value++; } public int get() { return value; } } public static void main(String[] args) throws InterruptedException { // 这个用了原子类 Counter counter = new Counter(); // 这个没有用原子类 Counter2 counter2 = new Counter2(); for (int i = 0; i < 50; i++) { new Thread(() -> { for (int j = 0; j < 100; j++) { counter.increment(); counter2.increment(); } }).start(); } Thread.sleep(2000); System.out.println(counter.get()); // 一定是5000 System.out.println(counter2.get()); // 可能少于5000 } }超级简单~
原子类的实现没细看,貌似是CAS吧
章小结本图源文件可以在github java-concurrent-programming-art-mini对应章下面找到
参考文献啃碎并发(二):Java线程的生命周期
相关资源gitbook笔记(看起来舒服,无法打开则请访问下边的地址)
gitbook笔记(没有上一个好看)
gitbook笔记github地址