独占锁 和 共享锁
Posted cb1186512739
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了独占锁 和 共享锁相关的知识,希望对你有一定的参考价值。
独占锁:独占锁也叫排他锁,是指该锁一次只能被一个线程所持有。如果线程T对数据A加上排他锁后,则其他线程不能再对A加任何类型的锁。获得排它锁的线程即能读数据又能修改数据。
ReentrantLock 和 synchronized 都是独占锁
共享锁:共享锁是指该锁可被多个线程所持有。如果线程T对数据A加上共享锁后,则其他线程只能对A再加共享锁,不能加排它锁。获得共享锁的线程只能读数据,不能修改数据。
独享锁与共享锁也是通过AQS来实现的,通过实现不同的方法,来实现独享或者共享。
ReentrantReadWriteLock:读锁是共享锁,写锁是独占锁。读锁的共享可以保证并发读是高效的,读写,写读,写写是互斥的
ReentrantReadWriteLock源码:
构造器无参数,默认是创建一个非公平锁;
我们看到 ReentrantReadWriteLock 有两把锁:ReadLock 和 WriteLock,见名知意,一个读锁一个写锁, 合称“读写锁”。
再进一步观察可以发现 ReadLock 和 WriteLock 是靠内部类 Sync 实现的锁。
Sync 是 AQS 的一个子类,这种结构在 CountDownLatch 、ReentrantLock 、Semaphore 里面也都存在。
在ReentrantReadWriteLock 里面,读锁和写锁的锁主体都是 Sync ,但读锁和写锁的加锁方式不一样。
读锁是共享锁,写锁是独占锁。读锁的共享锁可保证并发读非常高效,而读写、写读、写写的过程互斥,因为读锁和写锁是分离的。所以ReentrantReadWriteLock的并发性相比一般的互斥锁有了很大提升。
以上是关于独占锁 和 共享锁的主要内容,如果未能解决你的问题,请参考以下文章
理解AbstractQueuedSynchronizer提供的独占锁和共享锁语义