【发布时间】:2016-09-23 06:54:21
【问题描述】:
所以我有一个我目前正在使用的非线程安全 API(一些供应商软件),我们目前使用它的方式是每个线程一个对象。即每个线程都有:
Foo instance = new Foo();
但是,这似乎不适用于这个特定的库。它的一些非线程安全位仍然出现在头上,所以我假设这个库中有一些静态值。在一些我们知道它有问题的地方,我们目前正在使用 ReentrantLock 在需要时锁定类。即。
public class Bar {
protected static final ReentrantLock lock = new ReentrantLock();
public void process() {
Foo instance = new Foo();
boolean locked = false;
try{
if(SomeCondition) {
locked = true;
Bar.lock.lock();
}
*//rest of the processing goes here
} finally {
if(locked){
Bar.lock.unlock();
}
}
}
}
我的问题是:在所讨论的类不是线程安全的这种情况下,即使在创建所述类的新实例时,使用锁定是否更好,或者我应该看起来使用 ThreadLocals 代替? ThreadLocals 甚至会缓解我的实际问题吗?类的 ThreadLocal 版本是否实际上强制类的静态区域本质上是非静态的?
【问题讨论】:
-
不,ThreadLocal 不会强制类的静态区域本质上是非静态的
-
为什么你认为
ThreadLocal对每个线程中的本地对象的行为会有所不同? -
@StrangerintheQ - 好吧,那我想这回答了我的问题
-
如果您已经在每个线程使用一个实例,则供应商代码是线程 hostile,而不仅仅是线程不安全。
-
代替
ReentrantLock,用代理包装类并创建所有方法synchronized,然后在所有线程中使用该单个实例可能更容易。
标签: java multithreading static thread-safety thread-local