一.锁策略1.乐观锁VS悲观锁乐观锁预测接下来锁冲突的概率不高悲观锁预测接下来锁冲突的概率高synchronized既是悲观锁也是乐观锁它可以自动统计当前锁产生冲突的频率2.重量级锁VS轻量级锁重量级锁加锁开销比较大轻量级锁加锁开销比较小synchronized既是重量级锁也是轻量级锁3.挂起等待锁VS自旋锁挂起等待锁重量级锁的典型实现方式当出现锁冲突的时候线程进入到阻塞的状态自旋锁轻量级锁的典型实现方式当出现锁冲突的时候通过忙等的方式等待锁被释放synchronized在冲突概率不高的时候作为自旋锁冲突概率高的时候做为挂起等待锁4.公平锁VS非公平锁公平锁先来后到 非公平锁机会均等synchronized是非公平锁5.可重入锁VS不可重入锁可重入锁可以对同一个线程加锁两次不可重入锁不可以对同一个线程加锁两次synchronized是可重入锁6.普通互斥锁VS读写锁多个线程同时对同一个变量进行读操作本身是线程安全的多个线程对同一个变量同时或者一个读一个写才是不安全的7.读写锁的核心操作有三种1.加读锁 2.加写锁 3.解锁读锁和读锁之间不会竞争更高效写锁和写锁之间要竞争写锁和读锁之间也要竞争synchronized是普通互斥锁8.锁消除编译器优化的一种方式代码中写了加锁编译器会自行判定你这个加锁是否又意义锁没有意义编译器就可能会把锁去掉9.锁粗化锁的”粒度“代码越多锁的粒度就越粗二.CASCompare And Swap 比较和交换CAS的ABA问题在CAS中经常是要判定某个状态看这个状态是否发生改变如果未改变认为没有其他线程插队如果已经改变就是有其他线程插队就重试。但是有可能值没变但是别的线程修改了别的线程可以把这个值修改完在改回来Callable接口通过Callable实现一个“带有返回值的内容”三.Reentrant四.synchronized和ReentrantLock区别1.用法synchronized搭配代码块ReentrantLock传统的lock/unlock实现加锁解锁2.synchronized是Java的关键字底层是JVM内部通过C实现的ReentrantLock是标准库的类核心逻辑Java层面实现的3.ReentrantLock提供了tryLock方法可以通过tryLock设置超时时间4.ReentrantLock提供了公平锁的实现也提供了非公平锁的实现可以通过构造方法来回切换5.synchronized等待通知基于Object的wait和notify方法实现的ReentrantLock搭配特殊的Condition类