Java并发编程的艺术-Java中的锁

来源:互联网 发布:阿里云域名无需备案 编辑:程序博客网 时间:2024/06/08 11:05

Java中可以通过实现Lock接口的方式来创建自定义的同步部件,同步的部件核心其实就是同步队列(AbstractQueuedSynchronizer一般是通过一个内部类来实现它,然后实现他之中的几个方法);

可以这样理解锁与同步队列的关系:锁时面对使用者的,定义了使用者与锁之间的交互接口;而同步队列AQS是面向锁的,它简化了锁的实现方式,对用户来说,AQS屏蔽了同步管理,线程的排队,等待与唤醒等底层操作,锁和同步器很好的隔离了使用者和实现这所关注的领域。

在AQS中有一个volatile的state字段,用于描述锁的状态。AQS的核心就是主要通过getState()、setState(newState)、compareAndSetState(except,update)来操作state字段,以实现他自己的功能的。

AQS中可以被重写的方法
这里写图片描述

这里写图片描述

实现自定义同步组件时,将会调用同步器提供的模板方法。在模板方法中再去调用我们在同步器中重写的相关方法,所以说,同步组件不是直接去调用我们自定义的方法。

在同步器中提供的模板方法:
这里写图片描述

同步器提供的模板方法基本上分为3类:独占式获取释放同步状态共享式获取与释放 同步状态和查询同步队列中的等待线程情况自定义同步组件将使用同步器提供的模板方法来实现自己的同步语义。

综上可以总结出一个基本规律:
同步组件方法->AQS模板方法->AQS实现自定义方法(箭头代表调用)

同步器实现分析:
同步器依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成为一个节点(Node)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。同步队列中的节点(Node)用来保存获取同步状态失败的线程引用、等待状态以及前驱和后继节点,节点的属性类型与名称以及描述。

这里写图片描述

0 0
原创粉丝点击