Операционные системы. Процессы и потоки. Илюшкин Б.И. - 71 стр.

UptoLike

Составители: 

поток p1 снимает с буфера взаимоисключающую блокировку и
продолжает выполняться.
o Предположим, что p1 снова вызывает метод put(20). По-
скольку теперь full=true, потоку p1 приходится вызывать
метод wait(), чтобы дождаться освобождения буфера. Вызов
wait() блокирует поток p1 у входа в буфер и снимает блоки-
ровку с буфера для входа другого потока.
o Допустим, что следующим начинает выполняться поток g1. Он
вызывает метод get(), блокирует буфер для входа другого по-
тока, и поскольку буфер не пуст, считывает из него значение
10. Затем меняет флаг full на false и вызывает метод
notifyAll(). После этого освобождается ждавший у буфера
поток p1.
o Поток p1 не может сразу продолжить выполнение метода
put(20), так как буфер еще заблокирован. Возвращаясь из ме-
тода get(), поток g1 снимает блокировку с объекта-буфера, и
теперь поток p1 может продолжить выполнение put(20).
Данная схема описывает лишь один из возможных вариантов разви-
тия событий. Последовательность выполнения потоков зависит от
планировщика, и для разных реализаций виртуальной машины Java
может быть различной.
В качестве следующего примера приведем классический тестовый
код вычисления числа π на Java.
/******
* Pi.java
*
* compute pi by integrating f(x) = 4/ (1 + x**2)
*
* each thread:
* - receives the interval used in the approximation
71