AQS框架
2023-04-03 16:02:41 22 举报
AI智能生成
AQS ( Abstract Queued Synchronizer )是一个抽象的队列同步器,通过维护一个共享资源状态( Volatile Int State )和一个先进先出( FIFO )的线程等待队列来实现一个多线程访问共享资源的同步框架。
作者其他创作
大纲/内容
ReentrantLock
对比
Synchronlzed获取锁无法设置超时;ReentrantLock可以设置获取锁的超时时间。
Synchronlzed无法实现公平锁,ReentrantLock可以实现公平锁
Synchronlzed是java中的关键字,无法提供外部方法,使用的都是Object类的方法;
ReentrantLock是JUC中锁的一种实现,提供的方法稍微多一些。
ReentrantLock是JUC中锁的一种实现,提供的方法稍微多一些。
Synchrolzed在加锁代码执行完成或出现异常,自动释放锁;
ReentrantLock不会自动释放锁,需要在finally()代码中手动释放。
ReentrantLock不会自动释放锁,需要在finally()代码中手动释放。
锁的实现
公平锁 FairSync 每个线程公平的获取锁,不会出现线程饥饿的情况。
非公平锁 NonFairSync 独占试获取锁,容易出现线程饥饿的情况。
Condition
多线程协调通讯类
Condition 维护了一个线程等待队列,也是多线程件协调通讯的工具类
使得某个线程一起等待某个条件,满足条件才能唤醒,唤醒后,还需要更新竞争锁
使得某个线程一起等待某个条件,满足条件才能唤醒,唤醒后,还需要更新竞争锁
Semaphore 信号量
又被称为信号灯,在多线程环境下用于协调各个线程,
以保证他们能够正确,合理的使用资源。
以保证他们能够正确,合理的使用资源。
关键方法
acquire: 线程通过acquire() 方法获取到一个许可,然后对共享资源进行操作。
如果许可集分配完了,那么线程将进入等待状态,直到其他线程释放许可才有机会在获得许可
如果许可集分配完了,那么线程将进入等待状态,直到其他线程释放许可才有机会在获得许可
release:线程释放一个许可,许可将被归还给Samephore。
CyclicBarrier
CycliCBarrier类似于CountDownLatch,它能阻塞一组线程直到某个事件的发生。
CyclicBarrier与CountDownLatch的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。
CountDownLatch用于等待事件,而栅栏用于等待其他线程。
CyclicBarrier与CountDownLatch的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。
CountDownLatch用于等待事件,而栅栏用于等待其他线程。
await:await方法的线程告诉CyclicBarrier自 己已定到达同步点,然后当前线程被阻塞
CyclicBarrier同样提供带超时的await和不带超时的await方法。
CyclicBarrier同样提供带超时的await和不带超时的await方法。
CountDownLatch 基于AQS的共享模式使用,
而CyclicBarrier基于Condition来实现。
而CyclicBarrier基于Condition来实现。
ReentrantReaWriteLock
Java的并发包提供了读写锁ReentranReadWriteLock,它标识两个锁,
一个是读操作相关的锁,称为共享锁;一个是写相关的锁,称为排他锁。
一个是读操作相关的锁,称为共享锁;一个是写相关的锁,称为排他锁。
读写锁有以下三个重要的特性
公平选择性:支持非公平(默认)和公平的锁获取方式,吞吐两还是非公平优于公平。
重入:读锁和写锁都支持线程重入。
锁降级:遵循获取写锁、获取读锁再释放写锁的次序,写锁能够降级成为读锁。
公平选择性:支持非公平(默认)和公平的锁获取方式,吞吐两还是非公平优于公平。
重入:读锁和写锁都支持线程重入。
锁降级:遵循获取写锁、获取读锁再释放写锁的次序,写锁能够降级成为读锁。
CountDownLatch
通过一个计数器实现,计数器的初始量是线程的数量,每当一个线程执行完毕后,
计数器的数量-1,当计数器的值为0,标识所有线程都执行完毕。
计数器的数量-1,当计数器的值为0,标识所有线程都执行完毕。
await():调用await()方法的线程会被挂起,它会等待知道count值为0才继续执行。
await(long timeout,TimeUnit unit): 等待一定的时间后count值还没变为0的话就会继续执行。
countDown():将count值减1。
0 条评论
下一页