Java中的各种锁之独享锁和共享锁
来源:洛阳达内IT教育培训机构时间:2021/8/18 16:07:18
Java中的各种锁之独享锁和共享锁
独享锁
l又称排他锁,是指锁一次只能由一个线程持有。
l若线程T对数据A加排他锁,则其它线程不能再对A加任何类型的锁。
l获取排他锁的线程可以读取和修改数据。synchronized和JUC中Lock在JDK中的实现类是互斥锁。
共享锁
l指该锁可以由多个线程持有。
l若线程T对数据A加上共享锁,则其它线程只能对A加上共享锁,不能加排其锁。
l获取共享锁的线程只能读取数据,不能修改数据。
独享锁和共享锁也是通过AQS实现的,通过不同的方法实现独享或共享。用ReentrantLock和ReentrantReadWriteLock的源代码介绍独享锁和共享锁。
ReentrantReadWriteLock有两个锁:ReadLock和WriteLock,由词知意,一个读锁,一个写锁,合称为读写锁。通过进一步的观察,我们可以发现ReadLock和WriteLock是由内部Sync实现的锁。Sync是AQS的一个子类,它也存在于CountDownLatch、ReentrantLock和Semaphore中。
在ReentrantReadWriteLock中,读锁和写锁的锁主体是Sync,但读锁和写锁的加锁方式不同。读锁是共享锁,写锁是独享锁。阅读锁的共享锁可以增加并发读非常,而阅读、写作、写作的过程是相互排斥的,因为阅读锁和写作锁是分开的。因此,ReentrantReadWriteLock的并发性比普通互斥锁有了很大的提高。
读锁和写锁具体加锁方式的区别:
l次提到AQS时,提到了state字段(int类型,32位),用来描述有多少线程被锁定。
l这个值通常是0或1(如果是重入锁,state值就是重入的次数),而state则是共享锁中持有的锁的数量。
l但在ReentrantReadWriteLock中有读写两把锁,因此需要在一个整体变量state上分别描述读写锁的数量(或称状态)。
l因此,state变量按位切割分为两部分,高16位表示读锁状态(读锁数),低16位表示写锁状态(写锁数)。
尊重原创文章,转载请注明出处与链接:http://www.peixun360.com/3850/news/397500/违者必究!
以上就是洛阳达内IT教育培训机构 小编为您整理 Java中的各种锁之独享锁和共享锁的全部内容。