У меня есть хранилище объектов данных, и я хочу синхронизировать изменения, связанные с одним конкретным объектом, за раз.
class DataStore {
Map<ID, DataObject> objects = // ...
// other indices and stuff...
public final void doSomethingToObject(ID id) { /* ... */ }
public final void doSomethingElseToObject(ID id) { /* ... */ }
}
То есть я не хочу, чтобы в моем хранилище данных была одна блокировка, поскольку модификации различных объектов данных полностью ортогональны. Вместо этого я хочу иметь возможность взять блокировку, которая относится только к одному объекту данных.
Каждый объект данных имеет уникальный идентификатор. Одним из способов является создание карты ID => Lock
и синхронизация по одному объекту блокировки, связанному с идентификатором. Другой способ сделать что-то вроде:
synchronize(dataObject.getId().toString().intern()) {
// ...
}
Однако это похоже на утечку памяти - интернализованные строки могут никогда не собираться.
Еще одна идея заключается в синхронизации на самом объекте данных; однако, что если у вас есть операция, в которой объект данных еще не существует? Например, что будет синхронизировать метод типа addDataObject(DataObject)
?
В итоге, как я могу написать функцию f(s)
, где s
- это String
, такой, что f(s)==f(t)
, если s.equals(t)
, безопасным для памяти образом?