【问题标题】:JNI shared library not thread safeJNI 共享库不是线程安全的
【发布时间】:2013-02-02 08:21:51
【问题描述】:

我有一个本地库,我想在我的 Java 应用程序中使用它。多个线程将使用该库,并且多个 Java 进程也将使用同一个库。该库是用 C 编写的,我目前正在 Windows 上使用 MinGW 进行编译。我应该使用什么同步机制来同步非线程安全的本机库?

提前致谢!

【问题讨论】:

  • 这在一定程度上取决于库的结构。它是完全不安全的(即没有两个同时的线程可以调用方法)还是只是不安全地并发访问相同的数据?如果是这样,公共数据是否可以封装在 Java 对象中,还是在库中保持静态?
  • 这是一个非常简单的库,只提供一些功能,但必须保持状态。状态仅由调用该库的每个客户端的几个变量组成。
  • @Joachim Isaksson:并发访问不是线程安全的。客户将信息传递给图书馆,图书馆通常会为客户存储这些信息——它会跟踪客户所做的操作。所以原则上没有太多竞争条件的可能性,但是,我只是想知道使用 pthread-mutexes 是否足以在我跟踪客户端操作的哈希表中创建一个新条目。

标签: synchronization java-native-interface native-code


【解决方案1】:

最简单的方法是让所有的Java原生方法static synchronized

【讨论】:

  • 这在多个 Java 进程加载同一个共享库的情况下有何帮助?
  • @Java42 不同的进程将拥有完全独立的虚拟机,因此 JNI 线程安全问题(AFAIK 是由于对 JVM 资源的共享访问)不应该适用。事实上,我认为共享库永远不会因为它们由多个进程加载(例如,几乎每个进程在现代操作系统上加载一些系统调用库)而成为问题,除非共享库库正在不安全地访问系统资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 2017-10-02
  • 1970-01-01
相关资源
最近更新 更多