lock接口和核心方法
synchronized
reentrantlock 可重入锁
lock核心方法
void lock();
boolean tryLock();
void unlock();
lock接口与syc的比较
syc代码简单
lock:获取锁可被中断,获取锁超时,尝试获取锁,读多写少用读写锁。
可重入锁ReentrantLock、锁的公平与不公平
如果在时间上,先尝试获取锁的请求,一定先被满足,则这个锁就是公平锁。否则非公平锁。
一般情况,非公平锁的效率更高一些。
ReadWriteLock接口与ReentrantReadWriteLock
ReentrantLock和syn关键字都是排它锁。
读写锁:同一时间允许多个读线程同时访问资源,但是当写线程访问的时候,所有的读写线程全部阻塞,适合读多写少的场景。
condition接口
用Lock和condition实现等待通知
LockSupport工具
park开头的方法,用来阻塞线程
unpark(Thread thread) 用来唤醒线程
AQS:AbstractQueuedSynchronizer
什么事AQS?学习它的必要性
AQS的使用方式:继承
其中的设计模式:模板模式
了解其中的方法:
模板方法:
- 独占式获取锁:
- acquire(int arg)
- acquireInterruptibly(int arg)
- tryAcquire(int arg)
- 共享式获取锁:
- acquireShared(int arg)
- acquireSharedInterruptibly(int arg)
- tryAcquireSharedNanos(int arg, long nanosTimeout)
- 独占式释放锁:
- release(int arg)
- 共享式释放锁:
- releaseShared(int arg)
需要子类覆盖的模板方法:
- 独占式获取 acquire(int arg)
- 独占式释放 release(int arg)
- 共享式获取 acquireSharedInterruptibly(int arg)
- 共享式释放 releaseShared(int arg)
- 这个同步器是否处于独占模式 isHeldExclusively()
同步状态state:
- getState() 获取当前的同步状态
- setState(int newState) 设置当前的同步状态
- compareAndSetState(int expect, int update) 使用CAS设置同步状态,保证状态设置的原子性。
案例实操:java并发编程之模拟ReentrantLock独占锁
AQS实现原理
内部类:
- Node
- CANCELLED 线程等待超时或者是被中断了,需要从队列中移除
- SIGNAL 后续节点等待状态,当前节点等待后续节点去运行
- CONDITION 当前节点处于等待队列
- PROPAGATE 共享锁,当前状态向后面等待的线程传播
没写完。。。