JUC笔记

JUC笔记

💡 原文中文,约9900字,阅读约需24分钟。
📝

内容提要

本文是《深入理解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在读写锁的基础上增加了乐观读锁,写锁会无视乐观读锁。

➡️

继续阅读