Вот вопрос, который задавался много раз, я дважды проверил многочисленные вопросы, которые были подняты ранее, но ни один не дал мне элемент ответа, поэтому я решил поставить его здесь.
Вопросо том, чтобы сделать мой код поточно-ориентированным в Java, зная, что есть только одна общая переменная, но она может измениться в любое время, и на самом деле у меня такое ощущение, что код, который я оптимизирую, не предназначен для многопоточной среды, поэтому я мог бы иметьчтобы обдумать это ...
По сути, у меня есть один класс, который можно разделить, скажем, с 5 потоками. Этот класс имеет закрытое свойство «myProperty», которое может принимать 5 различных значений (по одному для каждого потока). Проблема заключается в том, что после его создания конструктором это значение больше не должно изменяться до конца жизни потока.
Мне довольно хорошо знакомы некоторые методы, используемые для превращения большей части кода в «thead-safe», включая блокировки, «синхронизированные» ключевые слова, переменные и атомарные типы, но у меня есть ощущение, что они выиграли »t помочь в текущей ситуации, так как они не препятствуют изменению переменной.
Вот код:
// The thread that calls for the class containing the shared variable //
public class myThread implements Runnable {
@Autowired
private Shared myProperty;
//some code
}
// The class containing the shared variable //
public class Shared {
private String operator;
private Lock lock = new ReentrantLock();
public void inititiate(){
this.lock.lock()
try{
this.operator.initiate() // Gets a different value depending on the calling thread
} finally {
this.lock.unlock();
}
}
// some code
}
Как это происходит, приведенный выше код гарантирует, что выиграли только два потокане изменяйте переменную одновременно, но последняя все равно изменится. «Наивный» обходной путь будет состоять в создании таблицы (operatorList), например (например, списка, карты и т. Д.), Связывающей оператор с идентификатором его вызывающего потока, таким образом, каждый поток просто должен будет получить доступ к своему оператору, используя свой идентификаторв таблице, но это заставит нас изменить все классы потоков, которые обращаются к общей переменной, и их много. Любая идея относительно того, как я мог бы хранить различные значения строки оператора исключительным образом для каждого вызывающего потока с минимальными изменениями (без использования магии)?