资料文档:https://www.jianshu.com/p/0f4a1995f57d
ReentrantReadWriteLock会使用两把锁来解决问题,一个读锁,一个写锁。
线程进入读锁的前提条件:
1. 没有其他线程的写锁
2. 没有写请求,或者有写请求但调用线程和持有锁的线程是同一个线程
进入写锁的前提条件:
1. 没有其他线程的读锁
2. 没有其他线程的写锁
来源(https://blog.csdn.net/zxhello/article/details/80284048)
没有使用锁降级的过程:
没有使用锁降级的时候,线程1执行到更新数据的时候,这时候来不及获取读锁,线程2就已经获取写锁了,所以导致了线程1获取的数据是线程2更新之后的数据。
使用锁降级的执行过程:
有使用降级锁的时候,线程1执行到睡眠之前的时候的,因为此有读锁,所以线程2无法进来,要等线程1执行完毕 释放读锁的时候,线程2才能拿到写锁,然后进行更新数据。
代码打印语句的执行地方: