У меня есть сложная карта, которая не нуждается в блокировке для частого получения и нечастых изменений, потому что ключи однозначно определяют поведение элементов, на которые они ссылаются.
То есть, если ключ один и тот же, структура, на которую он ссылается, всегда будет вести себя одинаково. На самом деле, ключ неизменяемый final, а значение, на которое указывает ссылка, является final и/или потокобезопасным.
Допустим, у меня есть изменчивая ссылка на базовый изменчивый массив ссылок в моей пользовательской хэш-карте. Мой алгоритм хеш-карты для этого массива использует элемент ar.length в качестве модуля, поэтому, если в функции get вызывающий объект увидит нетекущий массив, все его ссылки будут по-прежнему правильными и по-прежнему будут подчиняться хеш-слотам, поэтому, если он удается без мьютекса получить ненулевое значение, это правильно.
Мой план заключается в том, что всякий раз, когда получение терпит неудачу, вызывающая сторона затем создает правильное значение для ключа, выполняет размещение, которое выполняет блокировку по отношению к другим размещениям, и заполняет объект в массиве. Непосредственно перед выходом из критической секции код put переназначает поле энергозависимого массива «ar» самому себе, надеюсь, в качестве сообщения компилятору и компилятору горячей точки, чтобы создать забор относительно получения, которые используют ссылку на энергозависимый массив для поиска хешированного значения.
Это будет работать до тех пор, пока компилятор не отключит присваивание "ar = ar":
private volatile Object[] ar;
public Object get (Object key)
{
Object[] ar = this.ar;
// get the value from the correct hash slot
}
public synchronized Object put (Object key, Object val) {
{
... stuff a new object into the correct hash slot
ar = ar; // will the compiler truly compile this statement with
// normal volatile fencing relative to the get function??
... if a race condition causes a value to already be mapped, return and use that
... rather than the one we created and passed to put (different than normal put
... contract)
}