Предполагая этот сценарий:
- Поток-1 вызывает take() для пустого буфера
- Поток 2 вызывает put(1) в пустом буфере
- В момент t0 поток-1 получает блокировку в строке 24
- В момент t1, поскольку count==0 переходит в режим ожидания на уровне L27
Согласно javadoc на этом этапе поток снимает блокировку и переходит в режим ожидания. - При t2, поток-2 получает блокировку, установленную в строке 10
- В момент t3 поток выполняется до строки 17, что сигнализирует о том, что поток- 1
1 class BoundedBuffer {
2 final Lock lock = new ReentrantLock();
3 final Condition notFull = lock. newCondition();
4 final Condition notEmpty = lock. newCondition();
5
6 final Object[] items = new Object[100];
7 int putptr, takeptr, count;
8
9 public void put(E x) throws InterruptedException {
10 lock. lock();
11 try {
12 while (count == items. length)
13 notFull. await();
14 items[putptr] = x;
15 if (++putptr == items. length) putptr = 0;
16 ++count;
17 notEmpty. signal();
18 } finally {
19 lock. unlock();
20 }
21 }
22
23 public E take() throws InterruptedException {
24 lock. lock();
25 try {
26 while (count == 0)
27 notEmpty. await();
28 E x = (E) items[takeptr];
29 if (++takeptr == items. length) takeptr = 0;
30 --count;
31 notFull. signal();
32 return x;
33 } finally {
34 lock. unlock();
35 }
36 }
37 }
Подробнее здесь: https://stackoverflow.com/questions/790 ... ks-in-java
Мобильная версия