Capire sincronizzato
-
19-09-2019 - |
Domanda
Dato questo codice:
public class Messager implements Runnable {
public static void main(String[] args) {
new Thread(new Messager("Wallace")).start();
new Thread(new Messager("Gromit")).start();
}
private String name;
public Messager(String name) { this.name = name; }
public void run() {
message(1); message(2);
}
private synchronized void message(int n) {
System.out.print(name + "-" + n + " ");
}
}
Mi rendo conto che la parola chiave synchronized
rende il filo dipende blocco dell'oggetto. Domande:
A) è il blocco rilasciato non appena il metodo contrassegnato come finiture synchronized
? O non appena il metodo run()
del thread finisce
b) Posso garantire che uno dei fili sarà stampare il suo nome e 1 2
prima che l'altro?
Soluzione
A. Sì. E 'rilasciato non appena la funzione synchronized
finisce.
B. Sì. È possibile, ma se si voleva farlo, perché si scrivere codice multithreading, in primo luogo? synchronized
garantisce atomicità, non nulla per quanto riguarda l'ordine, ma è possibile imporre l'ordine da parte in attesa di una bandiera per cambiare. Ad ogni modo, ciò che si sta cercando di far rispettare è sequenzialità . È possibile ottenere questo gratuitamente in ambienti single-threaded:)