Понимание синхронизировано
-
19-09-2019 - |
Вопрос
Учитывая этот код:
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
гарантирует атомарность, а не что-либо, касающееся порядка, но вы можете обеспечить соблюдение порядка, дождавшись изменения флага.В любом случае, то, что вы пытаетесь навязать, это последовательность.Вы получаете это бесплатно в однопоточных средах :)