Java ReentrantLock原理

ReentrantLock支持公平、非公平方式获取互斥锁锁。是可重入锁。使用AQS的state字段记录获取锁的次数。

BASE理论

BASE是Basically Available(基本可用)、Soft State(软状态)和Eventually Consistent(最终一致性)的缩写。

Java AbstractQueuedSynchronizer笔记

AbstractQueuedSynchronizer使用CLH节点构建双向链表。在head获得锁、释放锁。在tail加入等待队列。AQS支持共享锁、独占锁、条件队列。为了解决并发释放共享锁,增加了PROPAGATE状态。

ThreadLocal原理

ThreadLocal是每个线程都能独立初始化、访问、修改的变量。ThreadLocal变量不是共享变量,不存在线程安全的问题,不需要同步。ThreadLocalMap的key是ThreadLocal类型,并且继承WeakReference。为了避免内存泄露,ThreadLocalMap的get、set、remove操作,对应key==null的情况,触发expungeStaleEntry清理。

wait、notify和生产者消费者模式

wait、notify、notifyAll在使用之前都要先进入synchronized,否则抛出IllegalMonitorStateException。notify随机唤醒一个线程,notifyAll唤醒全部线程。虚假唤醒问题,要循环检测判断条件,不能直接if判断。

java线程池原理

使用ThreadPoolExecutor创建线程池。ExecutorService是线程池任务的管理接口。ThreadPoolExecutor的ctl变量,打包了线程池状态和线程数量。

java synchronized实现原理

synchronzied使用了java的隐式锁机制(监视器锁、类锁),实现对关键区域代码执行的控制。synchronized可以修饰静态方法、非静态方法、代码块。对象锁和类锁是相互独立。synchronized代码块,使用jvm指令monitorenter、monitorexit实现。synchronized方法,则在class文件flags增加了ACC_SYNCHRONIZED。底层是锁状态的优化,包括无锁、偏向锁、轻量级锁、重量级锁。

java volatile

volatile解决多线程对共享变量可见性的问题。volatile最合适的场景是简单状态变量的发布。

聊聊java内存模型

java内存模型规范了JVM和内存交互行为,解决多线程对共享变量的访问和修改的安全性,以及约束指令重排序;主要包括happens-before规则和as-if-serial语义。