Synchronized wait notify
wait notify 方法调用必须先通过Synchronized 获得对象锁,否则会报 IllegalMonitorStateException
将notify放到wait前调用,不会提前唤醒,需要保证调用的顺序
Lock Condition await signal
和Synchronized一样, await signal 必须配合lock一起使用,否则报 IllegalMonitorStateException, 也会不提前唤醒
LockSupport park unpark
不需要提前上锁,并且可以先唤醒,再阻塞,
每个线程都有一个相关的permit,permit最多只有一个,重复调用unpark不会累加
Semaphore(信号量):是一种计数器,用来保护一个或者多个共享资源的访问。如果线程要访问一个资源就必须先获得信号量。如果信号量内部计数器大于0,信号量减1,然后允许共享这个资源;否则,如果信号量的计数器等于0,信号量将会把线程置入休眠直至计数器大于0.
获取: semaphore.acquire();
释放: semaphore.release();
查看当前允许数量:semaphore.availablePermits()
AQS AbstractQueuedSynchronizer 队列同步器
state int变量,记录锁的状态
CLH 队列 存储排队线程
Node节点包括 前指针,后指针,waitState, thread
阻塞入队列情况,队列第一个节点是一个虚假的哨兵节点
LockSupport
park()
unpark()