У меня проблема с многопоточностью Java. У меня есть 2 потока, обращающихся к методу A (), внутри которого есть цикл for, и в цикле вызывается метод B (). Метод A должен быть заблокирован с помощью блокировки имени потока -, а метод B должен быть заблокирован для идентификатора объекта, с которым работает метод B. Проверьте приведенный ниже код.
Текущий код
private static final ConcurrentHashMap<Object, Object> LOCKS = new ConcurrentHashMap<Object, Object>();
private void methodA(){
LOCKS.putIfAbsent(Thread.currentThread().getName(), new Object()))
synchronized (LOCKS.putIfAbsent(Thread.currentThread().getName(), new Object())) {
for(loop through all objects) {
methodB(Object1);
}
}
}
private void methodB(Object1 object1) {
LOCKS.putIfAbsent(object1.getObjectId(), new Object()))
synchronized(LOCKS.putIfAbsent(object1.getObjectId(), new Object())){
//<Work on object1>
}
}
Я сделал приведенный выше код, чтобы два разных потока могли параллельно обращаться к методу A (), но не должны одновременно работать с одним и тем же объектом 1 в методе B ()(. который вызывается методом methodA ()). т.е.; Хотя я хочу, чтобы поток A и поток B одновременно обращались к методу A (), который, в свою очередь, будет перебирать все объекты в цикле for и будет работать с каждым, вызывая метод B (), я не хочу, чтобы поток A и B для одновременного действия с одним и тем же экземпляром объекта. Отсюда приведенный выше код для блокировки метода B ()на основе идентификатора экземпляра объекта.
Необходимое улучшение.
В приведенном выше коде, если поток A и поток B приходят к методу B ()и обнаруживают, что они оба хотят работать с одним и тем же объектом «obj1», прямо сейчас с приведенным выше кодом либо поток A будет ждать, либо поток B будет ждать другой, чтобы закончить в зависимости от того, кто первым достиг и заблокировал метод B ().
Но представьте себе случай, когда поток A первым получает блокировку и выполняет метод B (), для завершения обработки 'obj1' требуется 9 часов. Поток B в этом случае должен будет ждать все 9 часов, прежде чем получить возможность выполнить метод B ()и тем самым обработать 'obj1'.
Я не хочу, чтобы это произошло. Поток B, как только он обнаружит, что метод B ()заблокирован на имя 'obj1' потоком A, должен двигаться дальше (и вернуться к obj1 позже ), чтобы попытаться заблокировать и обработать другие объекты. т.е.; он должен попытаться обработать другие объекты в цикле for, такие как obj1, obj2 и т. д. в списке объектов.
Мы будем признательны за любой вклад в решение этой проблемы «блокировки без ожидания».
Заранее большое спасибо за любую помощь.
Некоторые уточнения для улучшения ответов.