2011-11-11 43 views
2

Java的实时规范指出它提供了处理优先级反转案例的工具,如优先级继承和优先级上限协议。实时Java如何避免优先级反转

On POSIX,有pthread_mutexattr_getprotocol可以设置使用的协议来解决这个

PTHREAD_PRIO_NONE 
PTHREAD_PRIO_INHERIT //(PIP) 
PTHREAD_PRIO_PROTECT //(PCP) 

我想知道这样做对实时Java的等价性。

谢谢。

+0

当为实时考虑进行编程时,您倾向于设计您的应用程序,所以它首先不是问题。例如通过只使用线程本地状态。 –

+0

你能详细解释一下吗?你熟悉'WaitFreeReadQueue'对象吗? – 0xFF

+0

这似乎提供了与Queue.poll()和BlockingQueue.take()相同的功能。多年来,只有RTSJ中的一些功能才被添加到OpenJDK中。 ;)就个人而言,我避免使用Queue来最小化垃圾(因为您必须传递对象,而队列不会回收它们的对象),而是使用ByteBuffers,使用Pipe或Exchanger。 –

回答

1

要求符合RTSJ的实现至少支持优先级继承;优先上限是可选的。例如,IBM WebSphere Real Time支持优先级继承,并依赖于操作系统为所有Java锁提供优先级继承(这意味着总是有一个与任何锁定对象关联的pthread互斥量,尽管我们仍然有办法使速度快于否则会发出声音,特别是对于实际上没有争用的锁)。传统的非实时JVM倾向于用来加速短期保留的锁的自旋锁不能在实时JVM中使用,因为它们会在线程以不同的优先级运行时引入活锁问题(对于SCHED_RR/SCHED_FIFO策略无论如何,哪里更高的优先级抢占,期间)。