Condition接口实现线程间通信。底层使用AQS的ConditionObject
ReentrantLock支持公平、非公平方式获取互斥锁锁。是可重入锁。使用AQS的state字段记录获取锁的次数。
BASE是Basically Available(基本可用)、Soft State(软状态)和Eventually Consistent(最终一致性)的缩写。
AbstractQueuedSynchronizer使用CLH节点构建双向链表。在head获得锁、释放锁。在tail加入等待队列。AQS支持共享锁、独占锁、条件队列。为了解决并发释放共享锁,增加了PROPAGATE状态。
ThreadLocal是每个线程都能独立初始化、访问、修改的变量。ThreadLocal变量不是共享变量,不存在线程安全的问题,不需要同步。ThreadLocalMap的key是ThreadLocal类型,并且继承WeakReference。为了避免内存泄露,ThreadLocalMap的get、set、remove操作,对应key==null的情况,触发expungeStaleEntry清理。
wait、notify、notifyAll在使用之前都要先进入synchronized,否则抛出IllegalMonitorStateException。notify随机唤醒一个线程,notifyAll唤醒全部线程。虚假唤醒问题,要循环检测判断条件,不能直接if判断。
使用ThreadPoolExecutor创建线程池。ExecutorService是线程池任务的管理接口。ThreadPoolExecutor的ctl变量,打包了线程池状态和线程数量。
synchronzied使用了java的隐式锁机制(监视器锁、类锁),实现对关键区域代码执行的控制。synchronized可以修饰静态方法、非静态方法、代码块。对象锁和类锁是相互独立。synchronized代码块,使用jvm指令monitorenter、monitorexit实现。synchronized方法,则在class文件flags增加了ACC_SYNCHRONIZED。底层是锁状态的优化,包括无锁、偏向锁、轻量级锁、重量级锁。
volatile解决多线程对共享变量可见性的问题。volatile最合适的场景是简单状态变量的发布。
java内存模型规范了JVM和内存交互行为,解决多线程对共享变量的访问和修改的安全性,以及约束指令重排序;主要包括happens-before规则和as-if-serial语义。