内容提要
本文是《深入理解java虚拟机》第二版中关于java内存模型的描述。JMM规定了线程共享变量的读写规则,使用主内存和工作内存进行数据交互。可见性和指令重排序可以通过volatile、synchronized和final来保证。线程安全可以通过互斥同步和非阻塞同步来实现。创建线程的方式有继承Thread类、实现Runnable接口、实现Callable接口和使用线程池。ThreadLocal用于存储线程私有变量。AQS是JUC的基础,ReentrantLock和ReentrantReadWriteLock都是基于AQS实现的。StampedLock增加了乐观读锁。
关键要点
-
JMM定义了线程共享变量的读写规则,使用主内存和工作内存进行数据交互。
-
可见性和指令重排序可以通过volatile、synchronized和final来保证。
-
线程安全可以通过互斥同步和非阻塞同步来实现。
-
创建线程的方式有继承Thread类、实现Runnable接口、实现Callable接口和使用线程池。
-
ThreadLocal用于存储线程私有变量。
-
AQS是JUC的基础,ReentrantLock和ReentrantReadWriteLock都是基于AQS实现的。
-
StampedLock增加了乐观读锁。
-
synchronized是实现同步的一种手段,支持可重入锁。
-
CAS是乐观锁的一种实现,具有目标值地址、旧的目标值和新的目标值三个属性。
-
无同步的情况适用于没有共享数据的场景。
-
自旋锁适用于短时间的共享资源占用,jdk6引入自适应自旋。
-
偏向锁直接在markword中记录持有锁的线程id,提升性能。
-
Callable接口有返回值和异常,Future接口扩展了对线程监控的方法。
-
线程中断是让不活动的线程活动起来,对活动的线程无效。
-
ThreadLocalMap用于存储ThreadLocal对象的键值对,键使用弱引用。
-
AQS分为锁状态信号和线程等待队列,ReentrantLock底层使用AQS实现。
-
ReentrantReadWriteLock解决了读写锁的问题,但存在写饥饿和锁降级的问题。
-
StampedLock在读写锁的基础上增加了乐观读锁,写锁会无视乐观读锁。