独占锁 和 共享锁


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

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

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

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

 

 


ReentrantReadWriteLock源码:

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

 

 

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

 

posted @ 2020-04-21 14:12  IT路上的小白  阅读(1989)  评论(0编辑  收藏  举报