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?

Foi útil?

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:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top