多少线程安全性是太多?
我最近一直在读Java Concurrency in Practice——一本很棒的书。如果你认为你知道并发是如何工作的,但大多数时候你面对真正的问题,感觉SWAG是你能做的最多的事情,那么这本书肯定会对这个话题有所启发。当你试图在线程之间共享数据时,有多少事情实际上会出错,这有点可怕。我想这可能让我对线程安全有点疯狂。现在我担心的是,由于同步有点太多,我可能会遇到一些活动问题。下面是一段代码来说明:
private final Hashtable<String, AtomicInteger> userSessions =
new Hashtable<String, AtomicInteger>();
public void registerUser(String userLogin) {
synchronized(userSessions) {
AtomicInteger sessionCount = userSessions.get(userLogin);
if (sessionCount != null) {
sessionCount.incrementAndGet();
} else {
userSessions.put(userLogin, new AtomicInteger(1));
}
}
}
public void unregisterUser(String userLogin) {
synchronized(userSessions) {
AtomicInteger sessionCount = userSessions.get(userLogin);
if (sessionCount != null) {
sessionCount.decrementAndGet();
}
}
}
public boolean isUserRegistered(String userLogin) {
synchronized(userSessions) {
AtomicInteger sessionCount = userSessions.get(userLogin);
if (sessionCount == null) {
return false;
}
return sessionCount.intValue() > 0;
}
}
我尝试让它变得正确:同步集合在静态部分中构造并存储在静态最终引用中以便安全发布,锁定集合(而不是 - 这样我就不会阻止代码所在的整个类),并对基元使用原子包装器类。书中提到,过度这样做也可能会导致问题,但似乎我需要更多的时间来完全理解它。如何使此代码线程安全,并确保它不会受到活动性和性能问题的影响?this
编辑:把它变成实例方法和变量,最初一切都被声明为静态 - 糟糕,糟糕的设计。还使userSessions私有(不知何故,我之前将其公开)。