快速业务通道

实时Java,第3部分 - 线程化和同步 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16

执行 wait() 和 notify() 的线程当前必须已经锁定对象。

当线程试图锁定的对象已被其他线程锁定时将发生锁争用。当发生这种情况时,没有获得锁的线程被置于对象的锁争用者的一个逻辑队列中。类似地,几个线程可能对同一个对象执行 Object.wait(),因此该对象拥有一个等待者的逻辑队列。JLS 没有指定如何管理这些队列,但是 RTSJ 规定了这个行为。

实时Java,第3部分 - 线程化和同步(9)

时间:2011-06-22 Patrick Gallop Mark

基于优先级的同步队列

RTSJ 的原理是所有的线程队列都是 FIFO 并且是基于优先级的。基于优先级的 FIFO 行为 —— 在前面的同步示例中,将接着执行具有最高优先级的线程 —— 也适用于锁争用者和锁等待者的队列。从逻辑观点来看,锁争用者的 FIFO 基于优先级的队列与等待执行的线程执行队列相似。同样有相似的锁等待者队列。

释放锁以后,系统从争用者的最高优先级队列的前端选择线程,以便试图锁定对象。类似地,完成 notify() 以后,等待者的最高优先级队列前端的线程从等待中解除阻塞。锁释放或锁 notify() 操作与调度分派操作类似,因为都是对最高优先级队列头部的线程起作用。

为了支持基于优先级的同步,需要对 RT Linux 作一些修改。还需要对 WebSphere Real Time 中的 VM 作出更改,以便在执行 notify() 操作时委托 Linux 选择对哪一个线程解除阻塞。

优先级反转和优先级继承

优先级反转 指的是阻塞高优先级线程的锁由低优先级线程持有。中等优先级线程可能抢占低优先级线程,同时持有锁并优先于低优先级线程运行。优先级反转将延迟低优先级线程和高优先级线程的执行。优先级反转导致的延迟可能导致无法满足关键的时限。图 1 的第一条时间线显示这种情况。

优先级继承 是一种用于避免优先级反转的技术。优先级继承由 RTSJ 规定。优先级继承背后的思想是锁争用,锁持有者的优先级被提高到希望获取锁的线程的优先级。当锁持有者释放锁时,它的优先级则被 “降” 回基本优先级。在刚刚描述的场景中,发生锁争用时低优先级的线程以高优先级运行,直至线程释放锁。锁释放后,高优先级线程锁定对象并继续执行。中等优先级线程禁止延迟高优先级线程。图 1 中的第二条时间线显示了发生优先级继承时第一条时间线的锁定行为的变化情况。

图 1. 优先级反转和优先级继承

实时Java,第3部分 - 线程化和同步 - 编程入门网

可能存在下面一种情况:高优先级线程试图获取低优先级线程持有的锁,而低优先级线程自身又被另一个线程持有的另一个锁阻塞。在这种情况下,低优先级线程和另一个线程都会被提高优先级。就是说,优先级继承需要对一组线程进行优先级提高和降低。

优先级继承实现

优先级继承是通过 Linux 内核功能来提供的,通过 POSIX 锁定服务可将后者导出到用户空间。完全位于用户空间中的解决方案并不令人满意,因为:

Linux 内核可能被抢占并且常常出现优先级反转。对于某些系统锁也需要使用优先级继承。

尝试用户空间中的解决方案导致难于解决的竞态条件。

优先级提高总是需要使用内核调用。

实时Java,第3部分 - 线程化和同步(10)

时间:2011-06-22 Patrick Gallop Mark

POSIX 锁的类型为 pthread_mutex。用于创建 pthread_mutex 的 POSIX API 使用互斥锁来实现优先级继承协议。有一些 POSIX 服务可用于锁定 pthread_mutex 和为 pthread_mutex 解锁。在这些情况下优先级继承支持生效。Linux 在没有锁争用的情况下执行用户空间中的所有锁定。当发生锁争用时,在内核空间中进行优先级提高和同步队列管理。

WebSphere VM 使用 POSIX 锁定 API 来实现我们先前所描述的用于支持优先级继承的核心 Java 语言同步原语。用户级别的 C 代码也可以使用这些 POSIX 服务。对于 Java 级别的锁定操作

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号