私はアクセスを同期する必要がある静的マップを持っています。このマップは、ユーザーIDによってキーされます。私は、同じユーザーIDに関連するスレッドだけをブロックできるすべてのスレッドをブロックしないように、同期を最適化したいと考えています。静的マップのエントリとJavaの同期
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マップが静的であると、私はまだ持っています。つまり、効果的に静的エントリであるわけではないと仮定していますでグローバルロック(つまり、クラスオブジェクトの同期)?
ConcurrentHashMap.putIfAbsent()を使用すると、最初の同期ブロックを回避できます。 –