Как лучше всего увеличить количество замков?
Этот вопрос основан на результатах синхронизации с целым числом в 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
одновременно с разными int
s? Если нет, вы можете просто сделать оба звонка в пределах synchronized(this)
б) int
с не Object
s. Если вы измените doSomething
взять Integer
а также изменить все, что звонит doSomething
(и как там это называется, и так далее) также использовать Integer
с, вы можете синхронизировать на Integer
, Здесь важно убедиться, что каждый абонент будет использовать один и тот же Integer
объект - возможно иметь несколько Integer
с тем же int
значение, но синхронизируется по разному Integer
s не обеспечит защиту, которую вы ищете.