Многопоточность Java -блокировка без ожидания

У меня проблема с многопоточностью 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 и т. д. в списке объектов.

Мы будем признательны за любой вклад в решение этой проблемы «блокировки без ожидания».

Заранее большое спасибо за любую помощь.

Некоторые уточнения для улучшения ответов.

  1. И метод A (), и метод B ()относятся к одному классу. Метод B ()не относится к классу Object.
  2. На самом деле Thread A и Thread B являются потоками таймера, которые вызывают множество методов, включая A и B. Следовательно, блокировка на уровне потока (, поскольку поток вызывается каждые 15 минут или около того, и есть вероятность, что первое выполнение метода A ()не произойдет. быть завершено до второго вызова ).
  3. methodB (Obj1 )всегда принимает параметр Object1 и должен быть заблокирован на нем. Причина в том, что в этом классе есть другие методы, например, methodC (Obj1 )и methodD (Obj1 ), которые также принимают параметр Object1. Эти методы не должны выполняться одновременно для одного и того же экземпляра Object1. Следовательно, необходима блокировка параметра Object1.
  4. Поток B, обнаруживший, что метод B (Obj1 obj )уже заблокирован потоком A ()на объекте obj1, должен каким-то образом снова вызвать метод B (), но с другим объектом, скажем, obj2. Он должен вернуться к obj1, как только закончит с остальными.
0
задан Sujith R 9 August 2012 в 12:58
поделиться