网站建设方案书是啥,网站建设宣传,网站建设技术知乎,网页浏览器在哪里1.公平锁和非公平锁
1.1含义
公平锁:在竞争环境下#xff0c;先到临界区的线程比后到的线程一定更快地获取得到锁。非公平锁:先到临界区的线程未必比后到的线程更快地获取得到锁。
1.2如何自我实现
公平锁实现#xff1a;可以把竞争的线程放在一个先进先出的队列上。只要…1.公平锁和非公平锁
1.1含义
公平锁:在竞争环境下先到临界区的线程比后到的线程一定更快地获取得到锁。非公平锁:先到临界区的线程未必比后到的线程更快地获取得到锁。
1.2如何自我实现
公平锁实现可以把竞争的线程放在一个先进先出的队列上。只要持有锁的线程执行完了唤醒队列的下一个线程去获取锁就好了。
非公平锁实现:后到的线程可能比前到临界区的线程获取得到锁。那实现也很简单线程先尝试能不能获取得到锁如果获取得到锁了就执行同步代码了。如果获取不到锁那就再把这个线程放到队列呗 。
公平和非公平的区别: 线程执行同步代码块时是否会去尝试获取锁。如果会尝试获取锁那就是非公平的如果不会尝试获取锁直接进队列再等待唤醒那就是公平的。
2.AQS
2.1AQS的含义
给我们实现锁的一个框架内部实现的关键就是维护了一个先进先出的队列以及state状态变量。 先进先出队列存储的载体叫做Node节点该节点标识着当前的状态值、是独占还是共享模式以及它的前驱和后继节点等等信息。
简单理解就是: AQS定义了模板具体实现由各个子类完成。
总体的流程可以总结为: 会把需要等待的线程以Node的形式放到这个先进先出的队列上state变量则表示为当前锁的状态。
实现像ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore这些常用的实现类都是基于AQS实现的。
AQS支持两种模式: 独占 (锁只会被个线程独占)和共享 (多个线程可同时执行)。
3.ReentrantLock
3.1ReentrantLock加锁和解锁的过程 加锁当线程CAS获取锁失败将当前线程入队列把前驱节点状态设置为SIGNAL状态并将自己挂起。
解锁 把state置0唤醒头结点下个合法的节点被唤醒的节点线程自然就会去获取锁。
疑问为什么要设置前驱节点为SIGNAL状态 其实归终结底就是为了判断节点的状态去做些处理。 Node 中节点的状态有4种分别是: CANCELLED(1)、SIGNAL(-1)、CONDITION(-2)、PROPAGATE(-3)和0 在ReentrantLock解锁的时候会判断节点的状态是否小于0小于等于0才说明需要被唤醒。
4.总结
另外值得一提的是: 公平锁的实现与非公平锁是很像的只不过在获取锁时不会直接尝试使用CAS来获取锁。只有当队列没节点并且state为0时才会去获取锁不然都会把当前线程放到队列中。