Il mio take sarebbe non c'è alcuna differenza tra i due, tranne che il blocco di sincronizzazione potrebbe essere più localizzato in ambito e quindi il blocco sarà di minor tempo ??
Sì. Hai ragione. A differenza dei metodi synchronized
, le istruzioni sincronizzate devono specificare l'oggetto che fornisce il blocco intrinseco.
Esempio da java tutorial:
public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
}
nameList.add(name);
}
dichiarazioni sincrone sono anche utili per migliorare la concorrenza con sincronizzazione a grana fine. Puoi trovare un buon esempio nella stessa pagina di esercitazione per il caso d'uso successivo.
Supponiamo, ad esempio, che la classe MsLunch
abbia due campi di istanza, c1 e c2, che non vengono mai utilizzati insieme. Tutti gli aggiornamenti di questi campi devono essere synchronized
, ma non c'è motivo di impedire che un aggiornamento di c1 venga intercalato con un aggiornamento di c2 e così facendo si riduce la concorrenza creando blocchi non necessari. Invece di utilizzare metodi sincronizzati o utilizzare in altro modo il blocco associato a questo, creiamo due oggetti esclusivamente per fornire i blocchi.
E in caso di blocco su un metodo statico, su quale è la serratura presa? Qual è il significato di un Lock on Class?
In questo caso, il thread acquisisce il blocco intrinseco per l'oggetto Classe associato alla classe. Pertanto l'accesso ai campi statici della classe è controllato da un blocco che è diverso dal blocco per qualsiasi istanza della classe.
Quando si effettua un metodo come synchronized (non static
):
Non è possibile che due invocazioni di synchronized
metodi sullo stesso oggetto per Interleave. Quando un thread sta eseguendo un metodo sincronizzato per un oggetto, tutti gli altri thread che invocano metodi sincronizzati per lo stesso blocco oggetto (sospendi l'esecuzione) finché il primo thread non viene eseguito con l'oggetto.
Se si effettua un metodo come static synchronized
:
Non è possibile che due invocazioni di static synchronized
metodi su diversi oggetti della stessa classe per Interleave. Quando un thread sta eseguendo un metodo static synchronized
per un oggetto di Classe A, tutti gli altri thread che invocano i metodi static synchronized
su qualsiasi oggetto del blocco di Classe A (sospendi l'esecuzione) finché il primo thread non viene eseguito con l'esecuzione del metodo.
a trovare migliori alternative a sincronizzazione in questa domanda SE:
Avoid synchronized(this) in Java?
@ try-catch-, infine, che non è un duplicato di questo problema; quella domanda chiede se un metodo sincronizzato fornisce accesso esclusivo al solo metodo o all'intero oggetto. –
@MarkRotteveel Hai ragione in termini di diversi titoli. D'altra parte, le risposte dell'altro interrogativo coprono anche le differenze: esaminare la sezione sincronizzata con alcune affermazioni (o meno) e controllare dove bloccare (o non avere alcun controllo su ciò). –