
juc包下AQSawait之后进入条件等待队列singal/signalAll之后进入同步等待队列加锁解锁只与同步等待队列有关ReentrantLock解决线程安全问题竞争不够激烈使用synchronized轻量级锁完全在用户态执行不用阻塞线程 cas很多次阻塞线程 竞争激烈使用ReentrantLock只要有竞争就会阻塞线程、会有一次cas成功率低cas乐观锁java里面实现数组有两种实现1、数组2、链表3、堆悲观锁很悲观别人一定会来抢我的一定要上一把锁一定要阻塞住乐观锁cas 数据库版本号自旋cas 不停地尝试去获取锁非自旋 直接阻塞 很重的操作中断调用这个线程的中断方法加锁的逻辑里面能对中断标记有判断读到中断标记可以终止线程不可中断没有去判断这个线程是否有中断标记可重入锁同一个锁对象再次进入不会阻塞住持有锁的线程不可重入锁共享锁tryAcquireShared 信号量 资源与线程独占锁非公平锁效率高synchronized是JVM层次的锁实现ReentrantLock是JDK层次的锁实现synchronized的锁状态是无法在代码中直接判断的但是ReentrantLock可以通过ReentrantLock#isLocked判断synchronized是非公平锁ReentrantLock是可以是公平也可以是非公平的synchronized是不可以被中断的而ReentrantLock#lockInterruptibly方法是可以被中断的在发生异常时synchronized会自动释放锁而ReentrantLock需要开发者在finally块中显式释放锁ReentrantLock获取锁的形式有多种如立即返回是否成功的tryLock(),以及等待指定时长的获取更加灵活synchronized在特定的情况下对于已经在等待的线程是后来的线程先获得锁回顾一下sychronized的唤醒策略而ReentrantLock对于已经在等待的线程是先来的线程先获得锁