Reentrant Lock と条件を使用して Producer Consumer プログラムを作成しました。正しく動作していますが、実装が正しいかどうかはよくわかりません。さらに、それは最適ではないようです。誰かがこれが正しい実装であるかどうかを確認してください。さらに、それを最適化する方法を教えてください-本当に必要な場所でロックを取得するなど
public class TestRL {
static class Observed {
boolean filled = false;
public void setFilled(boolean filled) {
this.filled = filled;
}
public boolean getFilled() {
return filled;
}
}
static Observed observed = new Observed();
static class Consumer implements Runnable {
Observed observed;
ReentrantLock lock;
Condition condition;
Consumer(Observed observed, ReentrantLock lock, Condition condition) {
this.observed = observed;
this.lock = lock;
this.condition = condition;
}
@Override
public void run() {
lock.lock();
try {
for (int i = 0; i < 20; i++) {
if (observed.getFilled() == false) {
try {
System.out.println("consumer waiting");
condition.await();
System.out.println("consumed");
Thread.sleep(400 + 1000 * i % 2);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
observed.setFilled(false);
condition.signalAll();
}else{
observed.setFilled(false);
condition.signalAll();
}
}
} finally {
lock.unlock();
}
}
}
static class Producer implements Runnable {
Observed observed;
ReentrantLock lock;
Condition condition;
Producer(Observed observed, ReentrantLock lock, Condition condition) {
this.observed = observed;
this.lock = lock;
this.condition = condition;
}
@Override
public void run() {
lock.lock();
try {
for (int i = 0; i < 20; i++) {
if (observed.getFilled() == true) {
try {
System.out.println("producer waiting");
condition.await();
System.out.println("produced");
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
observed.setFilled(true);
condition.signalAll();
}else{
observed.setFilled(true);
condition.signalAll();
}
}
} finally {
lock.unlock();
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
Producer producer = new Producer(observed, lock, condition);
Consumer consumer = new Consumer(observed, lock, condition);
Thread t1 = new Thread(producer);
Thread t2 = new Thread(consumer);
t1.start();
t2.start();
}
}