如果一个库不是多线程的,该怎么办?

LB4*_*B40 4 java concurrency

我想多线程一个应用程序,但是我正在使用的一个库不是多线程的(我不知道什么是正确的单词?同步?).

我有什么选择?

据我所知,java中的线程和进程(Runtime.exec)之间没有任何东西(在jvm中没有抽象,有类似孤立的"java进程").

你会怎么处理?

编辑

感谢所有答案,再一次,一个间接层就可以解决问题.

Pét*_*rök 11

您可以确保一次仅使用一个线程来使用相关库.如果它包含可实例化的类,则有一种可能性是将它们保存在线程本地存储中.

或者你可以围绕它构建一个线程安全的包装器.

这些方法也可以组合在一起,例如,你可以将库包装在一个类中(在这种情况下它将是一个Facade),它本身不是线程安全的,但是你一次从一个线程访问它的实例.

更新:正如@Wim指出的那样,如果库管理全局状态,则必须有一个线程安全包装器,以确保在线程之间可以看到更改.


Mar*_*erg 6

我会创建一个Facade而不是直接使用该库.然后Facade应该同步到库的连接/调用.

就像是:

External Call    External Call    External Call
      |               |                |
      ----------------------------------             
                    Wrapper
                      |
                   Library
Run Code Online (Sandbox Code Playgroud)

更新:

Facade可能是错误的设计模式,因为它用于隐藏功能. 包装应该用作设计模式

  • Facade是一个略有不同的问题的设计模式 - 它应该是一个包装器或适配器. (3认同)