如何在 c# 和 java 进程之间使用互斥锁?

How can you use a mutex between c# and java processes?

我想使用从 java 到 c# 的内存映射文件来实现消费者-生产者模式。 我需要一种从 java 向 c# 发送信号的低延迟方式来读取数据。

在 c# 中,您可以在进程之间使用命名互斥锁 (new Mutex(true,"sharedMutex1")) 并使用 Mutex.WaitOne() 和 Mutex.ReleaseMutex() 控制进程之间。

如何从 Java 进程执行此操作?

编辑:我知道你可以使用文件锁来做到这一点,但我想远离文件系统以保持低延迟。

编辑:另一种选择是通过 JNI 使用 C++。所以我想我现在问是否可以直接在 Java 中完成?

有多个选项:

  • 如您所述,使用基于文件的锁定
  • 使用内存映射文件和基于低级内存访问的协议。这很难做到正确,您需要访问 'sun.misc.Unsafe' 操作。我会研究像 OpenHFT 这样的库,它为您提供了合理的 API 来应对不安全的操作。然而,还是很难。
  • 使用 JNI 将 Win32/unix API 用于进程间锁。我建议使用类似 JNA or JNR 的东西,它允许您在不编写 JNI C 部分的情况下调用 C api。

这里是调用 WIN32 锁的 JNA 示例 API:

/**
 * Definitions of the Win32 API. JNA has some for windows, so check first
 * In case CreateMutex is not included.
 */
public interface Kernel32Ex extends Kernel32 {
    WinNT.HANDLE CreateMutex(
            WinBase.SECURITY_ATTRIBUTES lpMutexAttributes,
            boolean bInitialOwner,
            String lpName
    );

    boolean ReleaseMutex(
            WinNT.HANDLE hMutex
    );
}

public static void main(String[] args) throws Exception {
    // The binding. Create it once
    final Kernel32Ex Win32 = Native.loadLibrary("kernel32", Kernel32Ex.class, W32APIOptions.UNICODE_OPTIONS);

    WinNT.HANDLE handle = Win32.CreateMutex(null,
            true,
            "My-Mutext");
    if (handle == null) {
        throw new Win32Exception(Win32.GetLastError());
    } else {
        System.out.println("Holding the win32 mutex");
        Win32.ReleaseMutex(handle);
    }
}