Sind diese Methoden getNewId()
& fetchIdsInReserve()
fadensicher?Ist diese Methode sicher?
public final class IdManager {
private static final int NO_OF_USERIDS_TO_KEEP_IN_RESERVE = 200;
private static final AtomicInteger regstrdUserIdsCount_Cached = new AtomicInteger(100);
private static int noOfUserIdsInReserveCurrently = 0;
public static int getNewId(){
synchronized(IdManager.class){
if (noOfUserIdsInReserveCurrently <= 20)
fetchIdsInReserve();
noOfUserIdsInReserveCurrently--;
}
return regstrdUserIdsCount_Cached.incrementAndGet();
}
private static synchronized void fetchIdsInReserve(){
int reservedInDBTill = DBCountersReader.readCounterFromDB(....); // read column from DB
if (noOfUserIdsInReserveCurrently + regstrdUserIdsCount_Cached.get() != reservedInDBTill) throw new Exception("Unreserved ids alloted by app before reserving from DB");
if (DBUpdater.incrementCounter(....)) //if write back to DB is successful
noOfUserIdsInReserveCurrently += NO_OF_USERIDS_TO_KEEP_IN_RESERVE;
}
}
Wird der '// fetch from DB here ...' - Code von anderen Threads blockiert? Insbesondere andere Threads, die angefangen haben, etwas DB-Zeug zu tun und * dann * wollen eine neue ID bekommen? Wenn dies der Fall ist, öffnen Sie sich potenziell für Deadlocks. – cHao
da der Aufruf dieser Methode nur über den synchronisierten Block innerhalb 'getNewId()' Ich glaube, diese Methode würde von nur einem Thread auf einmal aufgerufen werden, richtig? –
Ich gehe davon aus, dass dies nicht der einzige Code ist, der jemals eine Datenbank berühren wird ... anderer Code könnte Sperren erhalten und so auch. – cHao