17 读写锁
2020-05-26 本文已影响0人
random123
读写锁适用于读多写少的场景
三条原则:1.允许多个线程同时读共享变量; 2.只允许一个线程写共享变量; 3.如果一个写线程正在执行写操作,此时禁止读线程读或写共享变量。
读写锁示例,注意读写锁是可重入锁读写锁的升级与降级
读写锁升级:从读锁变成写锁, ReadWriteLock不支持!!
读锁还没有释放,获取了写锁,由于写锁互斥,必须保证读锁被释放,但是读锁释放是在写操作之后,陷入死锁读写锁降级:从写锁变为读锁 ReadWriteLock支持
锁降级为什么要在写锁中获取读锁(为什么支持锁降级)? 为了保证数据的可见性。假设两个线程A、B。如果写锁里没有读锁,线程A写完后,释放写锁;线程B获得了写锁,并写了数据,也释放了;但是线程A并没有结束,需要继续使用数据,但是此时数据已经被B修改了。 如果有读锁,线程A即使释放了写锁,由于读写的互斥性,线程A仍持有读锁,线程B无法获得写锁,会被阻塞。
获取写锁的前提是,其他线程没有占用写锁和读锁,自己的线程也没有占用读锁。
获取读锁的前提是,其他线程没有占用写锁,自己线程占用写锁是可以获取的。