【问题标题】:How can I implement java-like synchronization (monitors) using the Win32 API?如何使用 Win32 API 实现类 java 同步(监视器)?
【发布时间】:2010-09-15 12:32:45
【问题描述】:

每个 Java 对象(及其类)都有一个关联的监视器。在 pthread 术语中,Java 监视器相当于一个可重入互斥锁和一个条件变量的组合。

对于锁定,Win32 API 提供 Mutex 对象(可重入但重量级)和关键部分(不可重入但轻量级)。它还提供了其他同步构造,例如信号量和事件,但没有明确的条件变量概念。

如果我正在编写一个 JVM,我如何使用这些 Win32 概念来实现 Java 监视器?

【问题讨论】:

    标签: multithreading winapi mutex monitor condition-variable


    【解决方案1】:

    Windows 有 SignalObjectAndWait(),它的使用非常类似于在监视器中等待条件变量。您可以使用 Event(即 Reset)和 Mutex,然后使用 PulseEvent() 来执行相当于向条件变量发出信号的操作。

    【讨论】:

    • SignalObjectAndWait 和 PulseEvent 都不可靠。在某些条件下,它们不起作用。 SignalObjectAndWait 不保证是原子的。如果同时发生内核 APC 调用,则 PulseEvent 不起作用。将 SignalObjectAndWait 和 PulseEvent 结合起来可能是灾难性的。
    【解决方案2】:

    我建议您查看OpenJDK 的源代码,了解 ReentrantLock 类是如何实现的。

    (我自己没有检查过,所以我不确定答案)。

    util.concurrent 锁是使用原生 API 实现的。

    【讨论】:

    • 在 windows 上它是使用原生 API 而不是 Java 监视器实现的。
    • 我正在努力寻找相关的源代码。你能指出我正确的方向吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    相关资源
    最近更新 更多