1、Lock与AQS与CAS的关系
Lock面向用户,AQS面向Lock,也就是说AQS为各种Lock提供了底层的支持,AQS的最核心原理之一就是利用CAS更新同步状态。
2、AQS介绍
AQS是AbustactQueuedSynchronizer的简称,它是一个Java提供的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态。AQS的主要作用是为Java中的并发同步组件提供统一的底层支持,例如ReentrantLock,CountdowLatch就是基于AQS实现的,用法是通过继承AQS实现其模版方法,然后将子类作为同步组件的内部类。
3、AQS实现原理
先看看AQS的内部结构:
- 双向链表:用于存储请求同步变量(锁)的线程,当前持有锁的线程处于head,新进来的无法获取到锁的线程则被包装成为一个Node节点依次放于队尾。
- state:这是AQS里面最重要的一个变量,锁的获取与释放都与其密切相关。当它等于0时,表示没有线程持有锁,当大于0(锁可重入,每次获取锁,state加1)时表示有线程持有锁。其用volatile关键字声明,这样保证了其可见性,并结合CAS实现了同步。
用大白话来说,AQS就是基于CLH队列,用volatile修饰共享变量state,线程通过CAS去改变状态符,成功则获取锁成功,失败则进入等待队列,等待被唤醒。