java - mutex内部是如何实现的

标签 java multithreading synchronization mutex

我花了一些时间试图了解如何在多种语言中实现互斥体。有多个链接描述了主题 (*),但如果我理解正确,所有硬件提供的都是一些原子操作,可能有助于区分现在应该轮到谁。

在软件中,这总是用于忙等待(尝试 CAS 或测试并设置,如果不成功则在 while 循环中等待),但是调度程序如何知道现在我应该从 CPU 中拿走进程/线程,因为它所做的只是等待吗?操作系统中是否有一些支持,例如使用 Java 同步来发出“我被阻止,请让其他线程运行”的信号?我认为是的,因为忙等待是使用 lock() 的替代方法; (所以他们不应该是一样的)

*来源:

最佳答案

在 Linux JDK 中,源 C 代码使用 pthread 库,它是标准 C 库的一部分。反过来,它使用 Linux 内核 futex 功能 (man futex)。据我所知,这是使用内核调度程序实现的,使调用线程进入休眠状态并在收到信号时将其唤醒。

调度器本身依赖定时器中断(硬件)来工作——本质上,每次定时器中断到达时,调度器必须检查当前用户空间线程是否想要/必须暂停,如果是,它必须选择其他线程。

这里有几个进一步的链接,以获得更清晰和详细的解释:

  1. http://man7.org/linux/man-pages/man7/futex.7.html
  2. http://www.quora.com/How-different-is-a-futex-from-mutex-conceptually-and-also-implementation-wise
  3. 罗伯特·洛夫 (Robert Love) 的Linux Kernel Development 所著书籍(但奇怪的是,它没有只提及futex)和另一本书(其中确实包含 futex 提及,但主要是在对外部论文的引用中):Kerrisk 的 The Linux Programming Interface

关于java - mutex内部是如何实现的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29633429/

相关文章:

java - 通过 Google Cloud Endpoints 传输 BigDecimal 的异常(exception)情况

c# - 如何将参数从控制台应用程序 c# 传递到正在运行的进程?使用wcf?

android - 本地和远程数据的身份验证的体系结构/实现

java - 为什么 Display.asyncExec 或 Display.asyncExec 的 Object#wait 不是 "reasonable opportunity"?

c# - 从未同步的代码块调用了对象同步方法

mysql - 将本地 MySQL 数据库与云数据库同步

java - 基于内存的数据存储

java - 为什么 Joda 即时扩展原始类型 Comparable?

java - 在这种情况下我将如何正确使用数组?

Java:线程在所有类都没有 public void run() 的情况下工作?