独占锁 和 共享锁

Posted cb1186512739

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了独占锁 和 共享锁相关的知识,希望对你有一定的参考价值。


独占锁:独占锁也叫排他锁,是指该锁一次只能被一个线程所持有。如果线程T对数据A加上排他锁后,则其他线程不能再对A加任何类型的锁。获得排它锁的线程即能读数据又能修改数据。
    ReentrantLocksynchronized 都是独占锁

共享锁:共享锁是指该锁可被多个线程所持有。如果线程T对数据A加上共享锁后,则其他线程只能对A再加共享锁,不能加排它锁。获得共享锁的线程只能读数据,不能修改数据。

            独享锁与共享锁也是通过AQS来实现的,通过实现不同的方法,来实现独享或者共享。

              ReentrantReadWriteLock:读锁是共享锁,写锁是独占锁。读锁的共享可以保证并发读是高效的,读写,写读,写写是互斥的

 

 


ReentrantReadWriteLock源码:

构造器无参数,默认是创建一个非公平锁;

技术图片

 

 

我们看到 ReentrantReadWriteLock 有两把锁:ReadLock 和 WriteLock,见名知意,一个读锁一个写锁, 合称“读写锁”。
再进一步观察可以发现 ReadLock 和 WriteLock 是靠内部类 Sync 实现的锁。
Sync 是 AQS 的一个子类,这种结构在 CountDownLatch 、ReentrantLock 、Semaphore 里面也都存在。
在ReentrantReadWriteLock 里面,读锁和写锁的锁主体都是 Sync ,但读锁和写锁的加锁方式不一样。
读锁是共享锁,写锁是独占锁。读锁的共享锁可保证并发读非常高效,而读写、写读、写写的过程互斥,因为读锁和写锁是分离的。所以ReentrantReadWriteLock的并发性相比一般的互斥锁有了很大提升。

 

以上是关于独占锁 和 共享锁的主要内容,如果未能解决你的问题,请参考以下文章

并发编程—独占锁和共享锁

独占锁和共享锁有啥区别?

mysql的独占锁和共享锁

理解AbstractQueuedSynchronizer提供的独占锁和共享锁语义

图解 --乐观锁 悲观锁 可重入锁 独占锁 共享锁 公平锁 非公平锁

Semaphore