Java 信号量和互斥量在优先级反转方面的差异(可能还有优先级继承)

Java 信号量和互斥量在优先级反转方面的差异(可能还有优先级继承),java,multithreading,concurrency,Java,Multithreading,Concurrency,这个话题并不像看上去那么简单。正如我们所知,mutex可以由初始计数为1的信号量实现但通过阅读几篇文章,我还发现在分离这两个方面做了大量的工作,并将互斥体视为一个独立的概念,不同于信号量 的问题,这导致了一个新的概念,似乎有点困惑我 还有一些人谈到互斥体与所有权相关(如中所示)。嗯,所有权是一个坏名词。互斥绝对不是共享资源的所有者持有锁和释放锁是一种有效的信号传递方式,可能类似于,*嘿,等等!!直到我完成并给你发信号* 寻找导致将互斥体与信号量(初始计数=1)分离的一些具体原因Java中的互斥体

这个话题并不像看上去那么简单。正如我们所知,
mutex
可以由初始计数为1的信号量实现
但通过阅读几篇文章,我还发现在分离这两个方面做了大量的工作,并将
互斥体
视为一个独立的概念,不同于
信号量

的问题,这导致了一个新的概念,似乎有点困惑我

还有一些人谈到互斥体与
所有权相关(如中所示)。嗯,所有权是一个坏名词。互斥绝对不是共享资源的所有者
持有锁
释放锁
是一种有效的信号传递方式,可能类似于,
*嘿,等等!!直到我完成并给你发信号*


寻找导致将
互斥体
信号量
(初始计数=1)分离的一些具体原因Java中的互斥体(以内在锁和Java.util.concurrent.Lock的形式)与事件通知机制很好地结合在一起。通过信号量实现这样一个完整的互斥是有问题的:它需要释放一个信号量并获取另一个作为原子事务的信号量。

所有权意味着不能在一个线程中锁定互斥,在另一个线程中释放。所以信号量更具普遍性。您可以用一个信号量实现哑互斥,但不能用一个互斥来实现信号量

优先级反转是一种以下情况:

1) 高优先级线程A等待互斥

2) 低优先级线程B持有它,但在释放它之前无法执行

3) 中优先级线程C占用CPU

要处理这种情况,调度程序应具有一些逻辑:

要更快地启动A,请允许B而不是C执行

要理解是B阻止了A,它必须知道互斥锁的所有者。
对于信号量来说,不可能说是谁解锁了它:B还是C。所以没有办法执行这种逻辑。

嗯,不确定你在说什么。。我的意思是在事件通知机制方面。但无论如何,这些问题都是一般性的,与特定的编程语言无关。你明白我的意思了吗,-你是否附加了
mutex
semaphore
与面向对象编程的含义和区别?是的,你是对的。为了使优先级继承起作用,线程B将临时继承优先级较高的线程A的优先级。实际上,仅仅是一个
条件变量
,例如
信号量
,并不总是足够的。虽然可以用信号量模拟互斥
,但只适用于有限的场景集。例如:
递归互斥体
监视器
更复杂,仅通过
信号量
实现。我还发现这个链接非常有用: