jdk锁知识(三)—— Lock锁概述

1、Lock与volatile、synchronized区别,为什么需要Lock锁

Lock锁是java中的接口类,它具有很多的实现类,包括读锁、写锁、公平锁、非公平锁、可重入锁、读写锁等等。

volatile、synchronized是java中关键字,这是与LOCK锁本质的区别,我们可以基于Lock实现类做各种锁的优化和扩展,但是volatile、synchronized只能遵循已经定义好的功能。且volatile主要用于保证内存可见性,一般不用做实现锁的功能。

在JDK1.6之前,一般会首选Lock锁,因为它可控、功能丰富且可以根据需求扩展器功能,而synchronized则是一个依赖底层操作系统的重量级锁。但在JDK1.6对synchronized做了无锁、偏向锁、轻量级锁、重量级锁的优化之后,该关键字的性能有了很大提升,所以在一些简单的场合可以直接使用该关键字。但是对于一些对锁把控比较严格的场合,比如像超时取锁就取消竞争或者抛异常,以及共享读锁等需求就可以使用Lock锁。

2、Lock锁整体依赖关系、Lock锁种类

Lock锁是java中的一个接口,作为顶层接口,其有很多继承接口和实现类,常见依赖关系图如下:

由于常见得实现类是ReenTrantReadWriteLock,所以此处关系图也是到这个对象截止。可以看到Lock锁下面有很多实现类,读锁、写锁、可重入锁都是Lock的实现类,另外读写锁虽然是一个独立的接口,但是读锁、写锁上层规范还是由Lock下的读锁写锁限定。我们常用的锁一般则是其中的ReenTrantReadWriteLock和ReentrantLock锁。后续的源码分析则是主要从ReenTrantReadWriteLock入手。

另外可以看到无论哪个锁,底层都依赖了一个Sync对象,这个对象继承了AQS对象,并根据各个锁的应用场合进行了部分接口的实现和重写。所以AQS在java的Lock锁中占着举足轻重的地位,后续也会从源码角度专门分析下AQS的功能实现。

3、Lock锁的核心技术CAS与AQS

LOCK锁底层实现最依赖的两个核心技术,CAS用于无锁或者状态切换的并发安全性,AQS用于保证多线程对于资源的竞争有序性,而不至于所有线程不同循环等待锁或者集体挂起等待。

CAS(Compare And Swap 比较与交换 ):一种无锁算法,在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步,乐观锁最长使用的技术。但也有三个缺点

ABA问题:即将A变量改为了B,随后又改成A,这样无法判断变量是否修改过。不过在JDK1.5中引入了AtomicStampedReference解决此问题

长时间运行消费资源大:CAS本质是一直在循环判断的,这个时候CPU在持续运行,那么此时线程切换的开销将会小于CAS不停循环所需要的开销,此时不如使用有锁算法。

仅针对一个变量:对于多个变量操作,无法同时保证原子性

AQS(AbstractQueuedSynchronizer):是一个用于构建锁和同步器的框架,它提供了两个队列——同步队列、等待队列,保证了多个线程使用同一资源时锁竞争和锁等待的可行性。因为AQS比较重要,下一节从理论和源码的角度进行分析。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值