2011-12-07 18 views

risposta

18

Il blocco può essere o meno lo stesso di sincrono, a seconda del contesto. Quando parliamo di chiamate di metodo, si può anche dire che una chiamata sincrona sta bloccando (tornerò su questo in un po '), perché il thread che chiama il metodo non può procedere in avanti finché il metodo non ritorna. L'antonimo in questo caso sarebbe asincrono.

Nella terminologia di blocco, si dice che un blocco sta bloccando se il thread in attesa di acquisirlo viene messo in una modalità sospesa fino a quando il blocco diventa disponibile (o fino a quando non si verifica un timeout). L'antonym in questo caso è un blocco non bloccante, il che significa che il thread ritorna immediatamente anche se non può acquisire il lock. Questo può essere usato per implementare il cosiddetto blocco rotante, dove si continua a interrogare lo stato del blocco mantenendo il thread attivo.

Detto questo, è possibile estrapolare la differenza tra i concetti: sincrono generalmente indica un'attività che deve attendere una risposta prima che il thread possa andare avanti. Il blocco si riferisce al fatto che il thread è posto in uno stato di attesa (in genere significa che non sarà pianificato per l'esecuzione fino a quando non si verifica qualche evento). Da qui si può concludere che una chiamata sincrona può comportare un comportamento di blocco o meno, a seconda dell'implementazione sottostante (ad esempio può anche essere una rotazione, ovvero che si sta simulando un comportamento sincrono con le chiamate asincrone).

+1

Ciao, puoi fare un esempio in cui una chiamata bloccante non è sincrona? Grazie –

+0

@Always_Beginner: una chiamata di blocco per definizione sarà sempre sincrona perché implica che il flusso di controllo si blocchi mentre attende che qualcosa si completi. Tuttavia, una chiamata sincrona potrebbe non bloccarsi. – Tudor

2

sincrono significa che il lavoro viene eseguito nel thread che chiama la funzione e il metodo non viene restituito finché non è terminato.

i metodi asincroni restituiscono immediatamente perché un altro thread esegue il lavoro e solleva un flag o genera un evento quando il lavoro è terminato.

blocco significa che il thread che esegue un evento di blocco attenderà fino a quando l'evento si è verificato. per esempio provi a leggere da un socket e nessuno ti manda un messaggio. la chiamata di blocco non verrà restituita finché il messaggio non sarà stato ripristinato dal socket.

bene e non bloccante significa che l'opposto al blocco implica che le chiamate non bloccanti siano asincrone.

+0

thx kronos . sembra che il sincrono e il blocco non abbiano differenze, entrambi devono attendere un lavoro o un evento, quindi possono continuare a svolgere il lavoro o l'evento successivo. È giusto? – diligent

2

avrei classificarli come segue:

Blocco - Discussione attenderà sull'azione successo fino o il fallimento (Evidenzia sulla 'attenderà', il fallimento è comunemente un timeout)

sincrono - Discussione completerà la azione, sia per il successo o il fallimento, prima di raggiungere qualsiasi linea dopo che (punto culminante al termine dell'azione)

non bloccante - Discussione non aspetterà per completare l'azione, esegue l'azione immediatamente

Asynchr onous - Un altro thread (logico o fisico) completerà l'azione o informerà che è pronto utilizzando una callback, non aspetterà prima di eseguire i seguenti comandi. Nota: da qui il nome asincrono ha origine, poiché non è sicuro in quale ordine verranno eseguiti i comandi

0

Blocco: si dice che l'operazione abbia un comportamento di blocco se attende che alcuni eventi si completino. Ad esempio: se un blocco non è disponibile, un thread può entrare in uno stato di attesa sull'evento fino a quando il blocco è disponibile. Si dice che questa operazione stia bloccando.

Synchronous - La chiamata sincrona può essere facilmente compresa con un esempio di protocollo http in cui il client attende la risposta dal server e procede quindi. La chiamata sincrona può essere bloccante o non bloccante.

Asincrono - Un metodo può chiamare un altro metodo asincrono. Dopo una chiamata può continuare a eseguire la sua istruzione successiva. Quando chiamato metodo lo completa, l'esecuzione invierà una risposta/callback al metodo del chiamante in caso di successo o fallimento.

Non bloccante: il comportamento di non blocco è come verificare la condizione in quell'istanza. Ad esempio, in caso di blocchi, se non è disponibile, non aspetterà che sia disponibile come un'operazione di blocco. Inoltre, è necessario verificare ripetutamente la disponibilità dei blocchi in quanto non vi sarà alcuna richiamata come le chiamate asincrone.

Riepilogo: Il blocco è sempre sincrono.

Le chiamate sincrone hanno operazioni di blocco se sono in attesa del completamento di alcuni eventi, il metodo del chiamante può entrare nello stato di attesa.

La chiamata sincrona non è bloccante, se si verifica ripetutamente la presenza di qualche evento prima di procedere con l'istruzione successiva. Il metodo chiamante non entra nello stato di attesa su alcuni eventi da completare.

La chiamata asincrona non può essere bloccata e comporta la richiamata dal metodo chiamato che deve essere gestita.

Problemi correlati