синхронизация Java на строку как идентификатор - PullRequest
3 голосов
/ 26 августа 2011

Я прошел по ссылкам ниже Проблема с синхронизацией на объектах String? и http://illegalargumentexception.blogspot.com/2008/04/java-synchronizing-on-transient-id.html

Теперь мой вопрос:

  1. У меня есть картагде идентификатор пользователя и список некоторых свойств поддерживаются
  2. , когда мы сталкиваемся с новым идентификатором пользователя, мы создадим запись на карте
  3. , если идентификатор пользователя уже присутствует, мы добавим некоторые свойства к значению

вместо синхронизации по всей карте мы попытались выполнить синхронизацию по идентификатору пользователя, и это приводит к некоторому случайному поведению, если мы используем intern (), это работает, подход во второй ссылке также работает

Вопросы:

  1. при втором подходе мы по-прежнему блокируем всю карту, когда получаем ключ
  2. , существует ли какой-то другой способ синхронизации, так что доступ к карте синхронизируется на основетолько по идентификатору пользователя
  3. как лучше всего это сделать?

Ответы [ 2 ]

3 голосов
/ 26 августа 2011

Лучший способ - использовать ConcurrentHashMap из java.util.concurrent пакета . В этом классе есть все, что вам нужно. Не изобретайте колесо!

Примечание: Thilo прав: вы должны использовать специальную поточнобезопасную версию put для ConcurrentHashMap: putIfAbsent ()

2 голосов
/ 26 августа 2011

Используйте ConcurrentMap<String, UserProperties>.

Код для получения соответствующего UserProperties будет выглядеть так:

public UserProperties getProperties(String user) {
    UserProperties newProperties = new UserProperties();
    UserProperties alreadyStoredProperties = map.putIfAbsent(user, newProperties);
    if (alreadyStoredProperties != null) {
        return alreadyStoredProperties;
    }
    else {
        return newProperties;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...