【问题标题】:Multi threading on JAVAJAVA中的多线程
【发布时间】:2018-09-12 14:34:57
【问题描述】:

我在 JVM 多线程环境中遇到内存崩溃。在每个线程运行环境中,我正在加载 C++ 共享库的一个实例。 (比如 exm1.so、exm2.so 等)。

首先让我告诉你,C++ 共享库不是线程安全的。因此,我们正在使用 C++ 共享库的实例加载由 JVM 创建的每个线程。 Java 代码:

import com.sun.jna.Native;

Thread 1:

run{
  x libraryInstance = Native.loadLibrary(exm1.so, x.class);
  x. mymethod();
}

Thread 2:

run{
  x libraryInstance = Native.loadLibrary(exm2.so, x.class);
  x. mymethod();
}

我的问题是这个 .so 文件将存储在哪个内存中,JVM 是否以线程安全的方式管理每个线程内存?

在每个 .so 文件中都有 C++ malloc 函数调用。 JVM 有效地管理这个内存指针。

【问题讨论】:

    标签: java linux multithreading jna


    【解决方案1】:

    不,通常您必须自己管理安全的多线程,通过synchronized 构造,以保护对共享资源的访问。

    【讨论】:

    • 你能告诉我JVM会加载哪些内存.so。线程堆栈或堆。如果是堆,那么原生 .so 文件是线程安全的吗?
    • 不确定。您是在 lib 加载时还是调用时遇到崩溃?
    【解决方案2】:

    我得到了正确的答案。通过 JAVA 在 Linux 中的 dlopen 默认不使用 RTLD_LOCAL。我已经明确地通过了相同的。有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2014-06-13
      相关资源
      最近更新 更多