26 lines
2.0 KiB
Plaintext
26 lines
2.0 KiB
Plaintext
\b;Инструкция \c;synchronized\n; (для специалистов)
|
||
Метод \l;класса\u cbot\class; может быть объявлен с помощью \c;synchronized\n;. Данный метод помогает убедиться в том, что какая-либо функция никогда не выполняется более чем одним ботом.
|
||
|
||
Проиллюстрируем проблему:
|
||
\c;
|
||
\s;class blocking
|
||
\s;{
|
||
\s; static int nb = 33;
|
||
\s; synchronized int inc( )
|
||
\s; {
|
||
\s; int val = nb;
|
||
\s; wait ( 2 ); // ждать 2 секунды.
|
||
\s; nb = nb + 1;
|
||
\s; return val;
|
||
\s; }
|
||
\s;}
|
||
\n;
|
||
Что произойдет. если два боту будут выполнять метод \c;inc\n; в одно время¦?
|
||
Оба она будут выполнять \c;val=nb\n; и ждать две секунды, так что один из них будет иметь \c;val=33\n;. С помощью \c;synchronized\n; первый бот начнет выполнение с \c;val=33\n; и подождет 2 секунды, а затем вернет значение. Только после того, как первый бот вернет значение из метода \c;inc\n;, второй бот начнет выполнять метод \c;inc\n; и, следовательно, второй бот будет всегда иметь \c;val=34\n;.
|
||
|
||
Вы можете иметь больше синхронизаций \l;классов\u cbot\class; для того, чтобы предотвратить выполнение одного метода более чем одним ботом. Другими словами: до тех пор, пока один бот не закончит работу, другие боты не смогут выполнить этот класс.
|
||
|
||
\t;См. также
|
||
\c;\l;class\u cbot\class;\n;, \c;\l;static\u cbot\static;\n;
|
||
\l;Программирование\u cbot;, \l;типы\u cbot\type; и \l;категории\u cbot\category;.
|