一.什么是AQS?
1.AQS,AbstractQueuedSynchronizer,抽象队列同步器,是一个用于构建锁和同步器的框架。
2.基于AQS实现的锁或同步器有:可重入锁ReentrantLock、计时锁CountDownLatch、信号量Semaphore等
3.AQS三大核心
(1)state:用整型变量state来标记共享变量的状态,多线程通过操作state来实现锁或同步器机制,state需要用volatile修饰。
(2)queue:AQS内部维护一个基于FIFO算法和双向链表实现的队列。若线程请求共享变量失败,则会被包装成一个Node节点,存到队列尾部。当共享变量空闲,则会唤醒队列的第一个线程去操作变量。
(3)CAS:多线程操作state是通过CAS操作完成的。
4.AQS的两种模式:独占锁和共享锁
(1)独占锁:共享变量只能被一个线程获取到。state初值为0,表示无锁状态,线程可以使用;当线程获取到锁,则通过CAS操作对state加1,表示变量被上锁,其他线程不能使用;当state为0时会唤醒队列中的第一个线程。
(2)共享锁:共享变量可以被多个线程获取到。state初值为N,表示可以被N个线程使用;当线程获取到锁,则通过CAS操作对state减1;当state为0时,其他线程陷入阻塞;当有一个线程释放锁,就会唤醒队列中的第一个线程。
二.synchronized和Lock的区别
1.语法层面
(1)synchronized是关键字,源码在jvm中,由c++实现
(2)Lock是jdk提供的一个接口,由java实现
2.释放锁的方式
(1)synchronized在执行完代码块或者执行发生异常时,会自动释放锁
(2)Lock在执行完代码或者执行发生异常时,都不会主动释放锁,必须调用unlock()手动释放锁
3.功能层面
synchron