我有一個靜態地圖,我需要同步訪問。地圖由用戶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()來避免第一個同步塊。 –