第242天学习打卡(知识点回顾 AQS)

Posted doudoutj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第242天学习打卡(知识点回顾 AQS)相关的知识,希望对你有一定的参考价值。

知识点总结

AQS ----CyclicBarrier

CyclicBarrier :类似于CountDownLatch,它能阻塞线程知道某个事件发生。CyclicBarrier 与CountDownLatch的关键区别在于:所有的线程必须同时到达栅栏位置,才能继续执行。CountDownLatch用于等待事件,而栅栏用于等待其他线程。

await: await方法的线程告诉CyclicBarrier自己已经到达同步点,然后当前线程被阻塞。CyclicBarrier同样提供带超时时间的await和不带超时时间的await方法。

CountDownLatch基于AQS的共享模式使用,而CyclicBarrier基于Condition来实现的。

AQS---- CountDownLatch

通过一个计数器来实现,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0的时候,表示所有的线程执行完毕。

await():调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行。

await(long timeout, TimeUnit unit):等待一定时间后count值还没有变为0的话就会继续执行。

countDown():将count值减1

AQS----ReentrantLock

与Synchronized的对比:

  • synchronized获取锁无法设置超时,reentrantLock可以设置获取锁的超时时间。
  • synchronized无法实现公平锁,reentrantLock可以实现公平锁。
  • synchronized是java中的关键字,无法提供外部方法,使用的都是Object类的方法;reetrantLock是juc中锁的一种实现,提供的方法多一些。
  • synchronized在加锁代码块执行完成或者出现异常,自动释放锁;ReentantLock不会自动释放锁,需要在finally()代码块中显示释放。

锁实现:

  • 公平锁FairSync 每个线程公平的获取锁,不会出现线程饥饿的情况
  • 非公平锁NonFairSync 抢占式获取锁,容易出现线程饥饿情况。

Condition:

  • 多线程协调通信类
  • Condition 维护了一个线程等待队列,也是多线程间协调通信的工具类,使得线程一起等待某个条件,满足条件才唤醒,唤醒后,还需要重新竞争锁。

AQS----ReentrantReadWriteLock

java的并发包提供了读写锁ReentrantReadWriteLock,它表示两个锁,一个是读操作相关的锁,称为共享锁,一个是写相关的锁,称为排它锁。

读写锁有三个重要的特性:

公平选择性:支持非公平(默认)和公平的锁获取方式,吞吐量还是非公平优于公平。

重入:读锁和写锁都支持线程重入。

读降级:遵循获取写锁,获取读锁再释放写锁的次序,写锁能降级称为读锁。

B站:尚硅谷2021逆袭版Java面试题第三季(java大厂面试题,周阳主讲)_哔哩哔哩_bilibili

以上是关于第242天学习打卡(知识点回顾 AQS)的主要内容,如果未能解决你的问题,请参考以下文章

第241天学习打卡(知识点回顾 AQS之Semaphore)

第300天学习打卡(知识点回顾 hashmap如何实现线程安全)

第300天学习打卡(知识点回顾 hashmap如何实现线程安全)

第300天学习打卡(知识点回顾 hashmap如何实现线程安全)

第266天学习打卡(知识点回顾 springmvc支持的返回值)

第223天学习打卡(知识点回顾 线程池)