Che cosa è AbstractQueuedSynchronizer nel pacchetto concurrent.locks utilizzato? Qualcuno può far luce sui suoi metodi? Acquisire in modo irreversibile e parcheggiare AndCheckInterrupt?AbstractQueuedSynchronizer in Java concomitante
risposta
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.
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.
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:
- totale quantità di risorse.
- Quante risorse ogni volta che si prende.
- 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.
- 1. Accesso concomitante in SQLite
- 2. concomitante lavoro Esecuzione in Spark
- 3. elenco concomitante collegato
- 4. Job programmato Quartz Java: non consente l'esecuzione concomitante di Job
- 5. Java 8 parallelStream per concomitante chiamata Database/REST
- 6. ReactJS concomitante SetState race condition
- 7. Viene utilizzato un esempio pratico di LockSupport e AbstractQueuedSynchronizer?
- 8. Coda concomitante con GCD? (IOS 4.2.1)
- 9. Entity Framework - uso concomitante di contenitori
- 10. Buffer non bloccante con limiti Java per una situazione concomitante elevata
- 11. Struttura dati generica concomitante senza deadlock o mancanza di risorse
- 12. Creazione di una classe C++ a Monitor (nel senso concomitante)
- 13. Esecuzione concomitante del kernel CUDA con più kernel per flusso
- 14. collezioni sopprimere metodo non dà Modifica concomitante Eccezione
- 15. La coda Grand Central Dispatch principale è seriale o concomitante?
- 16. Valore di ritorno dell'operatore assegnazione nel codice concomitante
- 17. Reattivo nativo con Genymontion di lancio concomitante Eccezione
- 18. Angular2: concomitante non è riconosciuto come comando interno o esterno
- 19. Immaginate uno scenario concomitante reale in cui deve essere usato StringBuffer rispetto a StringBuilder?
- 20. Come determinare il collo di bottiglia della richiesta HTTP concomitante in .NET?
- 21. Java: Che cosa è "for (;;)"
- 22. serializzazione oggetti java - thread safe?
- 23. L'assegnazione del segnale (concorrente) all'interno di un'istruzione di processo sequenziale o concomitante?
- 24. Java ThreadPoolExecutor si blocca durante l'utilizzo di ArrayBlockingQueue
- 25. Perché haskell concomitante non deterministico mentre primitive haskell parallele (par e pseq) deterministiche?
- 26. Come rilevare il tipo di coda di invio (seriale o concomitante)?
- 27. In Java Concurrency In Practice di Brian Goetz
- 28. Coda concurrent e blocking in Java
- 29. java streams in Java 7
- 30. in Java
Aah! Grazie John ... Great Explanation – Hemanshu
@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. –