全国服务热线:400-6136-679

位置:洛阳达内IT教育培训机构 > 学校动态 > Java中的各种锁之独享锁和共享锁

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中。

Java中的各种锁之独享锁和共享锁

  在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中的各种锁之独享锁和共享锁的全部内容。

温馨提示:提交留言后老师会第一时间与您联系!热线电话:400-6136-679