
Лекции Java / 11. Многопоточное программирование. Общие принципы и реализация в Java.pptx
.pdf
Синхронизация
n Синхронизированный блок
//Блокируется указанный объект synchronized (ссылкаНаОбъект>) { // Тело блока синхронизации
}
n Синхронизированный метод
//Блокируется объект-владелец метода public synchronized void метод() {
// Тело метода
}
Самарский государственный аэрокосмический университет имени академика С.П. Королёва |
21 |

Новые виды ошибок
nОтсутствие синхронизации
nНеобоснованная длительная блокировка объектов
nВзаимная блокировка (deadlock)
nВозникновение монопольных потоков
nНерациональное назначение приоритетов
Самарский государственный аэрокосмический университет имени академика С.П. Королёва |
22 |

Совместная работа с полями и переменными
nЗначения переменных изменяются атомарным образом
nПри совместной работе с полем может возникнуть неоднозначность
•Например, на объект, на который ссылается переменная, наложена блокировка, после чего значение переменной изменяется
•Например, компилятор может оптимизировать фрагмент кода, предполагая, что поле не изменяет значение
Самарский государственный аэрокосмический университет имени академика С.П. Королёва |
23 |

Модификатор полей и переменных final
nПосле первого присвоения переменная не может изменять своё значение
nЕсли блокировка накладывается на объект, ссылка на который хранится в поле, поле обычно делают неизменяемым
nЛокальные и анонимные классы могут обращаться к локальным переменным, только если они неизменяемы
Самарский государственный аэрокосмический университет имени академика С.П. Королёва |
24 |

Модификатор полей volatile
nПредупреждает компилятор о том, что переменная может изменить своё
значение в произвольный момент времени
nОбращение к переменной всегда будет возвращать именно последнее присвоенное ей значение
nЕсли работа с полем ведётся только в синхронизированном коде, применение модификатора неосмысленно
Самарский государственный аэрокосмический университет имени академика С.П. Королёва |
25 |

Специальные методы класса Object
nКаждый объект имеет набор ожидающих потоков исполнения (wait-set)
nЛюбой поток может вызвать метод wait() любого объекта и попасть в его wait-set, остановившись до пробуждения
nМетод объекта notify() пробуждает один, случайно выбранный поток из wait-set объекта
nМетод объекта notifyAll() пробуждает все потоки из wait-set объекта
Самарский государственный аэрокосмический университет имени академика С.П. Королёва |
26 |

Особенности использования методов класса Object
nМетод может быть вызван потоком у объекта только после установления блокировки на этот объект
nПотоки, прежде чем приостановить выполнение после вызова метода wait(), снимают все свои блокировки
nПосле вызова освобождающего метода потоки пытаются восстановить ранее снятые блокировки
Самарский государственный аэрокосмический университет имени академика С.П. Королёва |
27 |

Запрещенные действия над потоками
nThread.suspend(), Thread.resume()
Увеличивает количество взаимных блокировок
nThread.stop()
Использование приводит к возникновению поврежденных объектов
Самарский государственный аэрокосмический университет имени академика С.П. Королёва |
28 |

Корректное прерывание потока
n public void interrupt()
Изменяет статус потока на прерванный
n public static boolean interrupted()
Возвращает и очищает статус потока (прерван или нет)
n public boolean isInterrupted()
Возвращает статус потока (прерван или нет)
nПоток должен в ходе своей работы проверять свой статус и корректно завершать работу, если его прервали
Самарский государственный аэрокосмический университет имени академика С.П. Королёва |
29 |

А если поток «спит»?
nВ том случае, если в текущий момент поток выполняет методы wait(), sleep(), join(), а его прерывают вызовом метода interrupt()…
nметод прерывает свое выполнение с выбросом исключения
InterruptedException !
nПотоку не сообщается, что его прервали!
Самарский государственный аэрокосмический университет имени академика С.П. Королёва |
30 |