关键
volatile int state :随子类定义什么意思
VarHandle
独占锁与共享锁
AQS中提供了两套锁机制: 共享锁与独占锁
- 共享锁:
可以有多个线程同时执行, 线程执行个数也会受到state限制, 如Semaphore,CountDownLatch等等
- 独占锁:
当前只有一个线程能够运行, 如ReentrantLock;
独占锁又分为公平锁(FairSync)和非公平锁(NonfairSync)
区别
tryAcquireShared是返回int,共享锁可以有多个状态
tryAcquire是返回boolen,独占锁只有true或者false
// 独占锁if (p == head && tryAcquire(arg)) { // 区别-------setHead(node);p.next = null; // help GCfailed = false;return interrupted;}// 共享锁if (p == head) {int r = tryAcquireShared(arg);if (r >= 0) { // 区别-------// 当该节点的前驱节点是头结点且成功获取同步状态setHeadAndPropagate(node, r);p.next = null; // help GCif (interrupted)selfInterrupt();failed = false;return;}}
**
公平锁: 所有线程严格按照FIFO占有锁.
final void lock() {acquire(1);}
非公平锁: 每个线程不管是否有其他线程等待, 都会先尝试抢占锁, 抢占失败再去CLH队列中等待锁资源释放.
final void lock() {if (compareAndSetState(0, 1))setExclusiveOwnerThread(Thread.currentThread());elseacquire(1);}
tryAcquire: 独占如何获得锁
tryRelease: 独占如何释放锁
isHeldExclusively: 独占模式下查看当前线程是否获取同步资源
tryAcquireShared: 共享如何获得锁
tryReleaseShared: 共享如何释放锁
问题
为什么说AQS是通过volatile和CAS实现的
state是通过volatile修饰的,往队列加东西的时候,是用的CAS操作
