Non è necessario bloccare poiché session.setAttribute()
è thread-safe (vedere il commento delle specifiche della servlet da @McDowell sopra).
Tuttavia, utilizziamo un esempio diverso. Supponiamo che tu voglia controllare il valore dell'attributo, quindi aggiornarlo se < = 100. In questo caso dovrai sincronizzare il blocco di codice per lo il confronto < = 100 e lo setAttribute()
.
Ora, che cosa dovresti usare per il lucchetto? Ricorda che non vi è alcuna sincronizzazione se vengono utilizzati oggetti diversi per il blocco. Quindi blocchi di codice diversi devono utilizzare lo stesso oggetto. La scelta dell'oggetto session
potrebbe essere perfetta. Ricorda anche che diversi blocchi di codice possono accedere alla sessione (sia in lettura/scrittura) anche se hai preso un blocco, a meno che quell'altro codice si blocchi anche sull'oggetto di sessione. Un trabocchetto qui è che troppi punti nel codice prendono un blocco sull'oggetto di sessione e quindi devono attendere. Ad esempio, se il tuo blocco di codice utilizza l'attributo di sessione A e un altro blocco di codice utilizza l'attributo di sessione B, sarebbe bello se non dovessero attendere l'uno sull'altro entrambi bloccando l'oggetto di sessione. L'uso di oggetti statici chiamati LockForA e LockForB potrebbe essere una scelta migliore per il tuo codice da utilizzare, ad es. synchronized (LockForA) { }.
fonte
2011-11-10 22:27:11
Questo non è un doppio controllo, questo è solo mettere un valore in una mappa se non esiste già. – Yishai
D'accordo, è presto. Eliminata. – Kevin
Rendere il blocco statico alla mia classe (che non è un servlet, ma una classe creata all'interno di una pagina jsp) assicura che tutte le richieste si sincronizzino sullo stesso blocco? – MCS