Вопрос

Учитывая этот код:

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 + " ");    
  }    
}

Я понимаю, что synchronized ключевое слово делает поток зависимым от блокировки объекта.Вопросы:

a) Снимается ли блокировка, как только метод помечен как synchronized заканчивает?Или как только поток будет run() метод завершается б) Могу ли я гарантировать, что любой из потоков напечатает свое имя и 1 2 перед другим?

Это было полезно?

Решение

A.ДА.Он будет выпущен, как только synchronized функция завершается.
B.ДА.Вы можете, но если бы вы хотели это сделать, зачем бы вам вообще писать многопоточный код? synchronized гарантирует атомарность, а не что-либо, касающееся порядка, но вы можете обеспечить соблюдение порядка, дождавшись изменения флага.В любом случае, то, что вы пытаетесь навязать, это последовательность.Вы получаете это бесплатно в однопоточных средах :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top