У меня есть статическая карта, к которой мне нужно синхронизировать доступ. Карта вводится с помощью идентификатора пользователя. Я хочу оптимизировать синхронизацию таким образом, чтобы не блокировать все потоки, где я мог бы блокировать только потоки, которые относятся к одному и тому же идентификатору пользователя.
private static Object s_lock = new Object();
private static Map<String,User> s_users = new HashMap();
...
private someMethod() {
synchronized(s_lock)
{
// keeping the global lock for as little as possible
user=getMapEntry();
}
synchronized(user) <-------- (1)
{
// time consuming operation
// hopefully only blocking threads that relate to same user id.
}
}
...
private User getMapEntry(String userId)
{
if (s_users.containsKey(userId)) {
user = s_users.get(userId);
}
else {
user = new User();
user.id = userId;
s_users.put(userId, user);
}
return user;
}
Мой вопрос - в (1) я предполагаю, что я не держу «глобальную» синхронизирующую блокировку, но поскольку карта s_users является статической, записи являются фактически статическими, то есть я все еще держу глобальную блокировку ( т.е. синхронизация с объектом класса)?