Учитывая этот код:Понимание синхронизируется
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
перед другим?
Вы фактически блокируете два разных экземпляра, поэтому 'sycnhronized' не будет ничего делать. (Явно использую блок «synchronized», а не модификатор, делает вещи более ясными. Лучше использовать отдельный объект блокировки.) –