1.1 AQS
AbstractQueuedSynchronizer: 互斥、共享
1.2 ReentrantLock设计思路
满足线程的互斥特性;意味着同一个时刻,只允许一个线程进入到加锁的代码中。-> 多线程环境下,线程的顺序访问。
-
- 一定会涉及到锁的抢占:
//需要有一个标记来实现互斥。全局变量(0,1) ==> CAS
-
-
抢占到了锁,怎么处理
//不需要处理,直接执行。
-
没抢占到锁,怎么处理
需要等待
//让处于排队中的线程,如果没有抢占到锁,则直接先阻塞->释放CPU资源)。
- 如何等待?
- wait/notify(线程通信的机制,无法指定唤醒某个线程)
- LockSupport.park/unpark(阻塞一个指定的线程,唤醒一个指定的线程)
- Condition (await/notify/notifyAll)
需要排队
//允许有N个线程被阻塞,此时线程处于活跃状态
-
通过一个数据结构,把这N个排队的线程存储起来。
//阻塞队列(双向链表)
- 如何等待?
-
抢占到锁,如何释放?
// LockSupport.unpark(Thread) -> 唤醒处于队列中指定的线程。
-
锁抢占的公平性(是否允许插队)
- 公平锁
- 非公平锁
-
重入的特性
// 识别是否是同一个ThreadID
-