Смущен тем, как ReentrantLock работает в JavaJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Смущен тем, как ReentrantLock работает в Java

Сообщение Anonymous »

Пример комментариев в javadoc для Condition. Источник
Предполагая этот сценарий:
  • Поток-1 вызывает take() для пустого буфера
  • Поток 2 вызывает put(1) в пустом буфере
Временная шкала:
  • В момент t0 поток-1 получает блокировку в строке 24
  • В момент t1, поскольку count==0 переходит в режим ожидания на уровне L27
    Согласно javadoc на этом этапе поток снимает блокировку и переходит в режим ожидания.
  • При t2, поток-2 получает блокировку, установленную в строке 10
  • В момент t3 поток выполняется до строки 17, что сигнализирует о том, что поток- 1
Поскольку поток-2 так и не дошел до момента снятия блокировки (строка 19), что происходит во время t3 , может ли выполняться Thread-1? Что нарушит контракт, согласно которому только одному потоку разрешено выполнять ReentrantLock одновременно?
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»