2012-03-10 8 views

risposta

10

Qual è AbstractQueuedSynchronizer in pacchetto concurrent.locks utilizzato per

L'AbstractQueuedSynchronizer è i mattoni per costrutti di sincronizzazione che vengono utilizzati e implementati (almeno) nella java.util.concurrency pacchetto.

Ad esempio, ReentrantLock delega a una sincronizzazione che estende AbstractQueuedSynchronizer. Se si dovesse scrivere il proprio lucchetto potrebbe apparire come questo

public class MyLock extends AbstractQueuedSynchronizer implements Lock{ 
    @Override 
    public void lock() { 
     super.acquire(1); 
    } 
    @Override 
    public void unlock() { 
     if(Thread.currentThread() != super.getExclusiveOwnerThread()) 
      throw new IllegalMonitorStateException(); 
     super.release(1); 
    } 
} 

Quindi, ecco la classe myLock erediterà la funzionalità a basso livello di sospensione filo & in coda al AQS durante la manipolazione alcuna funzionalità speciale stessa (per esempio questo blocco richiede che il thread che possiede il blocco sia quello che lo rilascia ma non un Semaforo).

Qualcuno può far luce sui suoi metodi e doAcquireInterruptibly parkAndCheckInterrupt

Nota: Questi metodi sono privati ​​alla classe così l'effettiva funzionalità è in grado di passare da una versione diversa o diverse implementazioni. La funzionalità fornita di default al momento che sto spiegando è la seguente:

doAcquireInterruptibly Cercherò di essere il proprietario esclusivo di questa sincronizzazione. Lo farà per sempre finché il thread non viene interrotto o acquisito con successo. Si consideri un thread che tenta di inserire un blocco synchronized, il thread si troverà lì e attenderà per sempre fino a quando non entra nel monitor (attualmente nessun thread ne possiede o il thread proprietario esiste il monitor). Il vantaggio qui è che il thread di acquisizione può essere interrotto.

parkAndCheckInterrupt Solo un metodo di comodità che sospende (parcheggia) un thread, restituisce mentre ripristina lo stato interrotto.

+0

Aah! Grazie John ... Great Explanation – Hemanshu

+1

@Hemanshu: Se questa risposta ti ha aiutato, contrassegnala come accettata. È un segno di gratitudine per coloro che ti aiutano e anche un modo per guidare gli altri che hanno questo problema. –

6
  • AbstractQueuedSynchronizer: fornisce un quadro di applicazione serrature blocco e sincronizzatori correlati come semafori, CountDownLatch ecc L'algoritmo di base per acquisire si cercano acquisire, se ritorno successo altro enqueue filo, se non è già presente nella coda e blocco il thread corrente. Allo stesso modo algoritmo di base per il rilascio è provare il rilascio, se ha successo, sbloccare il primo thread nella coda altrimenti semplicemente restituire. I thread attenderanno in code di attesa first-in-first-out (FIFO). I metodi astratti tryAcquire e tryRelease saranno implementati da sottoclassi in base alle loro necessità.

  • doAcquireInterruptivamente tenterà di acquisire il blocco. Se il blocco è già stato acquisito da qualche altro thread, il thread corrente verrà bloccato (parcheggiato). Se acquisisce il blocco, verrà semplicemente restituito.

  • parkAndCheckInterrupt parcheggerà il thread o in altre parole disabiliterà la pianificazione del thread fino a quando un altro thread non lo sbloccherà. Può essere dovuto al rilascio del blocco da parte del thread proprietario oa causa di un altro thread che lo interrompe. Se viene interrotto da qualche altro thread, verrà lanciata un'eccezione.
2

Mi piacerebbe parlare di AbstractQueuedSynchronizer (AQS) con alcune semplici parole.

Pensate a questi scenari nel mondo reale:

  • Per i nuotatori, possono nuotare insieme in una piscina (condiviso). Ma per un addetto alle pulizie che lo sanificherà con il cloro, deve aspettare finché tutti i nuotatori non sono andati (esclusivi).
  • Per i conducenti che sono al di fuori di un parcheggio occupato, devono attendere in coda. Di solito un portiere controlla l'accesso. Una macchina normale occuperà lo uno spazio di parcheggio. Una Lincoln Limousine può prendere due o più.

Come si vede, ci sei 3 variabili:

  1. totale quantità di risorse.
  2. Quante risorse ogni volta che si prende.
  3. Strategia di accesso (condivisa/esclusiva).

AQS è una classe modello utilizzata per gestire la SEZIONE CRITICA, il che significa che è possibile estenderla e compilare le variabili sopra per completare il lavoro. Sono stati nascosti dettagli come evitare il rischio di correre o controllare la coda.

Per ulteriori letture, è meglio conoscere il codice sorgente di Mutex, Semaphore e ReentrantReadWriteLock.

Problemi correlati