2010-10-15 11 views
11

Non riuscivo a capire quanto segue dalla descrizione del semaforo in javadocs.Semaforo e sincronizzazione

noti che nessun blocco sincronizzazione tenuta quando acquisiscono() viene chiamato come quella impedirebbe un articolo a essere restituite al pool. Il semaforo incapsula la sincronizzazione necessaria per limitare l'accesso al pool, separatamente da qualsiasi sincronizzazione necessaria per mantenere la coerenza di il pool stesso.

Qualcuno può aiutarmi a capire questo e le sue implicazioni.

risposta

11

Un semaforo funge da limitatore della profondità del pool di risorse disponibile; per esempio, un semaforo con una capacità di 10 consente un massimo di 10 thread per acquisirlo in una volta, e qualsiasi altro thread che tenta di acquisirlo bloccherà fino a quando uno degli altri thread lo rilascerà.

Questo è in qualche modo diverso dall'esclusione reciproca ordinaria o dal blocco del monitor, che viene in genere utilizzato per impedire a più thread di modificare simultaneamente le stesse variabili e causare risultati incoerenti o stato del programma.

Considerare, ad esempio, un pool di connessioni con un limite di 10 connessioni in esso. Ogni thread che ha bisogno di una connessione acquisirà il semaforo per la durata del suo utilizzo di una connessione (che impedisce a troppi thread di chiedere connessioni contemporaneamente), ma l'oggetto pool deve anche usare blocchi o metodi sincronizzati quando si prendono connessioni dal suo interno raccoglierli o rimetterli in ordine, per evitare che cose come perdere traccia di connessioni o consegnare erroneamente la stessa connessione a due thread diversi perché hanno chiesto simultaneamente.

+3

Una buona spiegazione, davvero. +1 –