Compreender sincronizado
-
19-09-2019 - |
Pergunta
Diante desse código:
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 + " ");
}
}
Eu entendo que a palavra-chave synchronized
faz o fio dependente de bloqueio do objeto. Perguntas:
a) é o bloqueio liberado assim que o método marcado como acabamentos synchronized
? Ou assim que termina método run()
da rosca
b) Posso assegurar que qualquer um dos tópicos irá imprimir o seu nome e 1 2
antes do outro?
Solução
A. Sim. É liberada logo que a função synchronized
acabamentos.
B. Sim. Você pode, mas se você quiser fazê-lo, por que você escrever código multithreaded em primeiro lugar? synchronized
garante atomicidade, não qualquer coisa a respeito da ordem, mas você pode impor ordem, esperando por uma bandeira para mudança. Enfim, o que você está tentando aplicar é sequentiality . Você ganha isso para ambientes single-threaded:)