17 读写锁

读写锁适用于读多写少的场景

三条原则:1.允许多个线程同时读共享变量;  2.只允许一个线程写共享变量;   3.如果一个写线程正在执行写操作,此时禁止读线程读或写共享变量。  

读写锁示例,注意读写锁是可重入锁

读写锁的升级与降级

读写锁升级:从读锁变成写锁, ReadWriteLock不支持!!

读锁还没有释放,获取了写锁,由于写锁互斥,必须保证读锁被释放,但是读锁释放是在写操作之后,陷入死锁


读写锁降级:从写锁变为读锁  ReadWriteLock支持

锁降级

为什么要在写锁中获取读锁(为什么支持锁降级)?    为了保证数据的可见性。假设两个线程A、B。如果写锁里没有读锁,线程A写完后,释放写锁;线程B获得了写锁,并写了数据,也释放了;但是线程A并没有结束,需要继续使用数据,但是此时数据已经被B修改了。  如果有读锁,线程A即使释放了写锁,由于读写的互斥性,线程A仍持有读锁,线程B无法获得写锁,会被阻塞。


获取写锁的前提是,其他线程没有占用写锁和读锁,自己的线程也没有占用读锁。

获取读锁的前提是,其他线程没有占用写锁,自己线程占用写锁是可以获取的。

你可能感兴趣的:(17 读写锁)