原理推荐文章:https://blog.csdn.net/qpzkobe/article/details/78586619
https://www.lmlphp.com/user/56/article/item/4738/
Lock是java提供的一种管理锁的接口。而synchonized是java的关键字。实现由jvm内部处理。使用Lock锁必须释放锁,否则可能死锁。synchonized不需要,jvm内部自己会处理。
只要锁加对了都不会出出现并发情况。只是线程之间是否阻塞的问题。分清阻塞和并发概念
lock接口顶定义:
public interface Lock {
void lock();//加锁。如果锁不可用,则当前线程将被禁用以进行线程调度,并处于休眠状态,直到获取锁
void lockInterruptibly() throws InterruptedException;//获取锁定,除非当前线程是interrupted 。通过interrupted操作可将等待线程响应中断的
boolean tryLock();//只有在调用时才可以获得锁。如果可用,则获取锁定,并立即返回值为true
。 如果锁不可用,则此方法将立即返回值为false
。
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;//去获取锁,并设置获取锁这个动作持续的时间
void unlock();//释放锁
Condition newCondition();//返回一个新Condition
绑定到该实例Lock
实例。
}
家族成员:如图所示 ReadLockView和WriteLockView看源码是一个final修饰的内部类,不知道干嘛,求大神指点
1ReentrantLock 可重入锁 公平锁与非公平锁
重入锁,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁阻塞。但是没有优先获取特权,只是可以再次加入争抢时间片的过程。synchonized符合可重入锁
公平锁与非公平锁:就是排队买东西的概念,公平锁就是排队,排在前面的获得锁。非公平锁就是不管排队顺序,大家一起抢锁
原理实现:其实内部就是一个FIFO,存储未获得锁的线程。以及一个int值 ,来记录状态
初始化流程: 可看出实际上ReentrantLock类实现Lock的行为。内部实现是由NonfairSync/FairSync类完成
获取锁流程:
参考推荐文章
使用案例:结果分析其实说到底ReentrantLock能做到的事情就是多线程阻塞同步并不能保证获取线程的顺序
2.ReentrantReadWriteLock 是实现ReadWriteLock(由两把锁 读锁 多线程下并发和写锁 多线程下同步)
ReentrantReadWriteLock 内部实现还是依赖于Lock体系中ReadLock和WriteLock,只是自己提供了实现。
WriteLock案例:
ReadLock案例