Lock接口基本实现原理

        在Lock接口的实现里面,有个比较有名的叫ReentrantLock,它的实现机制是靠其内部类Sync,而这个类是AbstractQueuedSynchronizer(AQS)的子类。这个类的主要功能是通过管理一个双向同步队列(FIFO)实现同步状态的管理,实现多线程对同步状态的访问安全。在同步队列种存储的数据结构是一个个的节点Node,其中包含了跟双向链表类似的前向节点和后续节点的引用,以及后续等待的节点引用以及被构造入的线程。在之后要讲的等待队列中的节点与这个是相同的定义。

            对于使用者来说,只需要了解同步队列是由同步器通过两个指向性的引用来管理的,下面是基本结构图:

,如果某个线程获取同步状态失败就会通过同步器的compareAndSetTail(Node expect , Node update)方法尝试进去同步队列的尾部并替换原先的tail引用。同步队列出队的条件是,当前结点为首节点,而且当前节点获取到同步状态成功。出队后会唤醒后续节点使其尝试获取同步状态。不过呢,对同步状态的获取在这里面有两种实现策略,一种使独占的获取同步状态(Node.EXCLUSIVE),就是同一个时刻最多有一个线程能获取到同步状态,其他的没获取到的就通过add'Waiter加入同步队列。另外一种就是共享式的,它允许多个线程同时获得同步状态(Node.SHARED)

        在Sync内部还聚合了Condition接口的子类ConditionObject,它提供了类似Object的监视器方法,来配合Lock实现等待通知模式。每个Condition自带一个等待队列,在某个线程调用了await方法之后就会从同步队列转移到等待队列里面去,在等待队列里面实际上是一个单向链表,类似于同步器,它保存了首节点和尾节点的引用,其他的方式与同步队列类似。只有当某个线程调用了该condition的signal方法(唤醒首节点)之后它才能从等待队列出来转移到同步队列里面去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值