これは愚かな質問かもしれませんが、ReentrantLockを2つの別のスレッドがこのクラスで使用できる理由を理解できません(ArrayBlockingQueueスレッドとロック)をプレイする:ArrayBlockingQueueの2つのスレッドでReentrantLockを取得できる理由
class SampleThreadSafeQueue {
private ReentrantLock lock = new ReentrantLock();
private List<Integer> list = new ArrayList<>();
private Condition notEmpty;
private Condition notFull;
private volatile int count;
public SampleThreadSafeQueue() {
notEmpty = lock.newCondition();
notFull = lock.newCondition();
}
public int take() {
try {
lock.lock();
System.out.println(Thread.currentThread().getName() +": acquired lock in take()");
while (count == 0) {
notEmpty.await();
}
return extract();
} catch (Exception e) {
e.printStackTrace();
return 0;
} finally {
System.out.println(Thread.currentThread().getName() +": released lock for take()");
lock.unlock();
}
}
private int extract() {
int index = count <= 0 ? 0 : count - 1;
Integer integer = list.get(index);
list.remove(index);
count--;
list.clear();
notFull.signal();
return integer;
}
public void put(int value) {
try {
lock.lock();
System.out.println(Thread.currentThread().getName() +": acquired lock in put()");
while (!list.isEmpty()) {
notFull.await();
}
Thread.sleep(3000); // let's assume it takes 3 secs to add value
insert(value);
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println(Thread.currentThread().getName() +": released lock for put()");
lock.unlock();
}
}
private void insert(int value) {
list.add(value);
count = list.size();
notEmpty.signal();
}
}
私はコンソールでこの結果を受け取る:
pool-1-thread-1: acquired lock in put()
pool-1-thread-1: released lock for put()
pool-1-thread-1: acquired lock in put() - this guy has taken the lock
pool-1-thread-2: acquired lock in take() - that guy has taken the lock as well! wtf?
pool-1-thread-2: released lock for take()
Value = 0
pool-1-thread-2: acquired lock in take()
pool-1-thread-1: released lock for put()
pool-1-thread-1: acquired lock in put()
pool-1-thread-2: released lock for take()
Value = 1
pool-1-thread-1: released lock for put()
pool-1-thread-1: acquired lock in put()
pool-1-thread-2: acquired lock in take()
pool-1-thread-2: released lock for take()
Value = 2
...
私は条件が私はしばらくのサイクルで使用しますが、論理的にそれが起こるん理由を理解することができないからだと疑います。 あなたの説明に感謝します。ありがとう!