Таким образом, у меня есть API-интерфейс, не поддерживающий потоки (некоторое программное обеспечение поставщика), которое я сейчас использую, и способ, которым мы в настоящее время используем его, - это один объект на поток. то есть каждая нить имеет:ThreadLocal и non-thread safe 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 на самом деле вынуждает статические области класса существенно нестационарными?
no, ThreadLocal не является статическими областями класса по существу не статическими –
Почему, по вашему мнению, 'ThreadLocal' будет действовать по-разному с локальным объектом в каждом потоке? –
@StrangerintheQ - Ну, ладно, я полагаю, что это отвечает на мой вопрос – eerongal