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
   63   64   65   66   67   68   69   70   71   72   73