一、j.u.c简介
1.java.util.concurrent //并发工具包
2.锁的基本要素
2.1 一个共享的数据来记录状态
二、Lock
0.synchronized和ReentrantLock的区别
1.关键字、一个是J.U.C
2.释放
局限性:不够灵活,锁释放要么执行完,要么出异常。
1.Lock是什么
1.1Lock是一个interface。
1.2Lock 提供了获得锁和释放锁的方法
2.重入锁
2.1 ReentrantLock 重入互斥锁--表示可以重新进入的锁。
2.1.1唯一实现了Lock接口的一个类。
lock.lock(),增加重入次数
synchronized也支持重入。
代码示例:
2.1.2 当多个线程竞争锁的时候,其他线程怎么办?
阻塞
2.2 ReentrantReadWriteLock --重入读写锁
读->读 是共享的
读->写 互斥
写->写 互斥
适用场景:读多写少的场景。
代码示例:
三、AQS--抽象队列同步器
1.概念:同步工具
2.功能:
2.1独占->互斥
2.2共享->读读
3.基本实现:
用双向链表去维护等待获得锁的线程对象
Node节点 上节点 下节点 线程
状态(state):锁标记
0是无锁状态
>=1是有锁状态(表示可以重入)
4.CAS
偏移量 cas(obj,offset,expect,update)
乐观锁
本地方法:
四、Sync
1.非公平锁--NonfairSync
允许插队
2.公平锁--FairSync
不允许插队
五、关系图
时序图