Используйте ConcurrentHashMap
, чтобы вы могли использовать putIfAbsent
. Вам не нужно кодировать AtomicInteger
для синхронизации.
public final ConcurrentMap<String, AtomicInteger> userSessions =
new ConcurrentHashMap<String, AtomicInteger>();
public void registerUser(String userLogin) {
AtomicInteger newCount = new AtomicInteger(1);
AtomicInteger oldCount = userSessions.putIfAbsent(userLogin, newCount);
if (oldCount != null) {
oldCount.incrementAndGet();
}
}
public void unregisterUser(String userLogin) {
AtomicInteger sessionCount = userSessions.get(userLogin);
if (sessionCount != null) {
sessionCount.decrementAndGet();
}
}
public boolean isUserRegistered(String userLogin) {
AtomicInteger sessionCount = userSessions.get(userLogin);
return sessionCount != null && sessionCount.intValue() > 0;
}
Обратите внимание, это утечка ...
Попытка в версии без утечек:
public final ConcurrentMap<String, Integer> userSessions =
new ConcurrentHashMap<String, Integer>();
public void registerUser(String userLogin) {
for (;;) {
Integer old = userSessions.get(userLogin);
if (userSessions.replace(userLogin, old, old==null ? 1 : (old+1)) {
break;
}
}
}
public void unregisterUser(String userLogin) {
for (;;) {
Integer old = userSessions.get(userLogin);
if (old == null) {
// Wasn't registered - nothing to do.
break;
} else if (old == 1) {
// Last one - attempt removal.
if (userSessions.remove(userLogin, old)) {
break;
}
} else {
// Many - attempt decrement.
if (userSessions.replace(userLogin, old, old-1) {
break;
}
}
}
}
public boolean isUserRegistered(String userLogin) {serLogin);
return userSessions.containsKey(userLogin);
}
Я успешно использую разные декларативные основы в одной сессии. Это может быть полезно при использовании нескольких баз данных: каждая база создается с собственными метаданными, и все метаданные привязаны к отдельной базе данных. Некоторые из ваших декларативных баз могут определять дополнительные методы или использовать другой метакласс для установки расширений.
Отдельные базовые классы будут работать нормально.
Вы должны быть осторожны, когда они используют разные соединения с базой данных, в этом случае вы не можете использовать соединения в двух базах данных - каждый запрос должен поступать в одну базу данных.