Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratornaya_rabota_7.doc
Скачиваний:
11
Добавлен:
05.06.2015
Размер:
3.25 Mб
Скачать

Ключевое слово volatile

Механизм синхронизации помогает в решении многих проблем, однако, если вы откажетесь от его использования, сразу несколько потоков смогут одновременно изменять значение некоторого поля. Если это делается намеренно (может быть, для синхронизации доступа используются другие средства), следует объявить поле с ключевым словом volatile. Например, если у вас имеется переменная, значение которой постоянно отображается потоком графического вывода и может изменяться несинхронизированными методами, то фрагмент вывода может выглядеть следующим образом:

currentValue = 5;

for (;;) {

display.showValue(currentValue);

Thread.sleep(1000); // подождать 1 секунду

}

Если бы значение currentValue не могло изменяться внутри метода ShowValue, то компилятор мог бы предположить, что величина currentValue остается в цикле постоянной, и просто использовать константу 5 вместо вызова showValue.

Однако, если во время выполнения цикла значение currentValue может быть изменено другим потоком, то предположение компилятора будет неверным. Объявление поля currentValue с ключевым словом volatile не позволяет компилятору делать подобные предположения.

Варианты заданий:

  1. Разместить на форме друг под другом несколько кнопок и устроить гонки от левого края формы до правого. Каждая гонка должна ехать со своей скоростью (каждый раз определяющейся случайным образом) и в отдельном потоке. Гонка останавливается, как только какая-то кнопка достигнет «финиша». Финалист меняет цвет фона + появления окна сообщения с именем победителя. Необходимо наличие возможности рестарта гонки с «правильным» завершением соответствующих потоков.

  2. Работать игру «теннис» в объеме первых телеприставок. Задача игроков отбивать мяч, перемещая ракетки вверх-вниз. Ракетки находятся в левой и правой части экрана и перемещаются с помощью клавиатуры. Мяч отскакивает от верхней и нижней стенок. Каждая ракетка и мяч должны выполнятся в отдельных потоках. Должен вестись счет, а также иметься кнопка, для начала игры заново (обнуляющая счет и «правильно» завершающая соответствующие потоки).

  3. Реализовать «синхронные» методы чтения/записи для переменной типа String. Правила обращения следующие:

    1. Записывать в одно время может только один поток, любой следующий «писатель» должен ждать (блокироваться).

    2. Если один поток выполняет запись, то любой читатель должен ждать завершения этой записи.

    3. Пока происходит чтение, запись невозможна.

    4. Однако требуется избежать такой ситуации, когда запись невозможна из-за сменяющих друг друга операций чтения.

    5. Любое количество читающих потоков могут читать одновременно

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]