Как лучше всего увеличить количество замков?

Этот вопрос основан на результатах синхронизации с целым числом в NullPointerException и возник из этого вопроса. Синхронизация с целым значением

Я хотел знать, как лучше всего увеличить количество блокировок в Java. Кроме того, что реализовано в ConcurrentHashMap т.е. на основе фиксированного массива и путем вычисления хеша ключа для ссылки на индекс массива?

Ниже то, что ожидается. Если doMoreThing() для одного объекта в процессе, то я не должен делать doAnotherThing() для того же объекта, если он вызван из другого потока.

public void doSomething(int i) {
    doAnotherThing(i);// some checks here based on it it will call to
                        // doMoreThing
    doMoreThing(i);
}

1 ответ

Каждый Object в Java есть связанная блокировка. Если вы хотите новую блокировку, вы можете создать новую Object, Упомянутый вопрос не проясняет, почему вы пытаетесь увеличить количество блокировок или что вы подразумеваете под этим. Может быть, вы можете предоставить более подробную информацию.

Обновить следующий измененный вопрос

Я думаю, что я вижу, к чему вы стремитесь: по сути, вы хотите synchronized блок на int тот doSomething проходит мимо. Есть два относительно простых способа сделать то, что вы ищете:

а) Действительно ли важно, чтобы несколько потоков могли вызывать doSomething одновременно с разными ints? Если нет, вы можете просто сделать оба звонка в пределах synchronized(this)

б) intс не Objects. Если вы измените doSomething взять Integer а также изменить все, что звонит doSomething (и как там это называется, и так далее) также использовать Integerс, вы можете синхронизировать на Integer, Здесь важно убедиться, что каждый абонент будет использовать один и тот же Integer объект - возможно иметь несколько Integerс тем же int значение, но синхронизируется по разному Integers не обеспечит защиту, которую вы ищете.

Другие вопросы по тегам