Page 68 - 4657
P. 68
System.out.println("]");
} }
class Caller implements Runnable {
String msg;
Callme target;
public Caller(Callme t, String s) {
target = t;
msg = s;
new Thread(this).start();
}
public void run() {
target.call(msg);
} }
class Synch {
public static void main(String args[]) {
Callme target = new Callme();
new Caller(target, "Hello.");
new Caller(target, "Synchronized");
new Caller(target, "World");
}
}
Ви можете бачити з приведеного нижче результату роботи
програми, що sleep у методі call приводить до переключення
контексту між підпроцесами, так що висновок наших 3 рядків-
повідомлень перемішується:
[Hello.
[Synchronized
]
[World
]
]
Це відбувається тому, що в нашому прикладі немає нічого,
здатного перешкодити різним підпроцесам викликати одночасно
той самий метод того самого об'єкта. Для такої ситуації є навіть
спеціальний термін - race condition (стан гонки), що означає, що
різні підпроцеси намагаються випередити один одного, щоб
завершити виконання того самого методу. У цьому прикладі для
того, щоб цей стан було очевидним і повторюваної,
66