java - 信号量和互斥量在优先级反转方面的区别(也许还有优先级继承)

标签 java multithreading concurrency

嗯,这个话题并不像看起来那么简单。正如我们所知,mutex 可以由初始计数为 1 的信号量实现。
但是通过几篇文章,我也发现在将这两者分开并将 mutex 视为不同于 semaphore 的独立概念方面付出了巨大的努力>
Priority Inversion的问题,这导致了一个新概念priority inheritance ,让我有些困惑。

还有一些人谈到关于 ownership 的互斥量(如 what-is-mutex-and-semaphore-in-java-what-is-the-main-difference 中所示)。好吧,ownership 是个糟糕的术语。 Mutex 绝不是共享资源的所有者。 Holding a LockReleasing a Lock 是一种有效的信号传递方式,例如,*嘿等等!!直到我完成并向你发出信号*

寻找导致 MutexSemaphore(初始计数 = 1)分离的具体原因

最佳答案

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

优先级反转有以下几种情况:

1)高优先级线程A等待mutex

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

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

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

尽早启动 A 让 B 代替 C 执行

要了解是 B 阻止了 A,它必须知道互斥量所有者。 对于信号量,不可能说出谁解锁了它:B 或 C。因此无法执行此类逻辑。

关于java - 信号量和互斥量在优先级反转方面的区别(也许还有优先级继承),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20949071/

相关文章:

java - 使用多线程读取30GB文件

java - 是否可以在同一个 java web 应用程序中使用 xml 创建一些 bean,并使用基于注释的方法创建其余的 bean

java - Eclipse - 使用类名操作自动生成类 Javadoc

java - 使用嵌入式容器和 JNDI 运行 Spring Boot 应用程序

java - 使用 PDFBox 从 Java 编辑 PDF

具有 const 函数的 C++ 线程安全

python - 在 ctypes 回调函数中使用线程锁

scala - Scala 中的函数并行性和惰性

php - 如何在mysql中管理并发?

并发环境中的 C++11 std::vector