「追加」メソッドと「取得」メソッドには、最初のスレッドがデータを追加し、2番目のスレッドがデータを取得するいくつかのブロック機構を持つキューがあります。上記のコードでデッドロックの待機/通知
public synchronized MyObj getData() {
synchronized (myLock) {
synchronized (this) {
if (isEmpty()) {
wait(0);
}
}
return getData();
}
}
public synchronized void addData(MyObj data) {
if (!isFull()) {
putData(data);
synchronized (this) {
notify();
}
}
}
、最初のスレッドがデータを取得しようとすると、キューが空である場合、私は待機を経て、待機中に入れた(0)他のスレッドまで通知()を経由して待ってからリリースをキューにデータを追加します。
今、私はキューがいっぱいになると、いくつかのいずれかがそれにデータを追加しようとしたときに、別の「ロック」を追加します:結果は、私が期待するものではありません
public synchronized MyObj getData() {
synchronized (myLock) {
synchronized (this) {
if (isEmpty()) {
wait(0);
}
}
synchronized (this) {
notify();
}
return getData();
}
}
public synchronized void addData(MyObj data) {
synchronized (myLock) {
synchronized (this) {
if (isFull()) {
wait(0);
}
}
}
synchronized (this) {
notify();
}
PutData(data);
}
、私は私が死んを得ることを推測しますロック原因プロセスが停止しています。
UPDATE
これは私がデータを取得する方法である:
queueSize--;
startPointer = (startPointer + 1) % mqueueSize;
data = (String) queue[startPointer];
これは私はあなたがjava.util.BlockingQueueで見ていないのはなぜ
queueSize++;
endPointer = (endPointer + 1) % mqueueSize;
queue[endPointer] = data;
public synchronized boolean isEmpty() {
return queueSize== 0;
}
public synchronized boolean isFull() {
return queueSize== mqueueSize;
}
2の理由、 – kenny