아래 코드는 임의의 값을 순환 대기열에 삽입하여 제거하려고합니다. 그러나 몇 가지 동기화 문제가 있습니다. 더 높은 수준의 루틴을 사용할 수 있다는 것을 알고 있으며 프로덕션 코드를 위해 그렇게 할 것입니다.하지만 이것이 왜 작동하지 않는지 궁금합니다. 내가 여기서 무엇을 놓치고 있니?이 코드가 illegalMonitorState 예외를 발생시키는 이유는 무엇입니까?
public class CircularQueue {
int count;
int rear;
int front;
Object lock = new Object();
int size;
int[] array;
CircularQueue(int size)
{
this.size= size;
array = new int[size];
}
void enqueue(int number) throws InterruptedException
{
if(isFull())
lock.wait();
synchronized(lock)
{
array[rear] = number;
System.out.println("Rear is:"+ rear+ "value is:"+number+"Size is:"+size);
rear = (rear+1)%size;
count++;
}
lock.notify();
}
void dequeue() throws InterruptedException
{
if(isEmpty())
lock.wait();
synchronized(lock)
{
int retVal = 0;
retVal = array[front];
System.out.println("Front is:"+ front+ "value is:"+retVal);
front = (front+1)%size;
count--;
}
lock.notify();
}
boolean isFull()
{
if(count == size)
{
return true;
}
else
return false;
}
boolean isEmpty()
{
return count == 0;
}
}
// 테스트 클래스
import java.util.Random;
public class App {
public static void main(String[] args) throws InterruptedException
{
final Random random = new Random();
final CircularQueue circularQueue = new CircularQueue(10);
Thread t1 = new Thread(new Runnable(){
@Override
public void run() {
try {
circularQueue.enqueue(random.nextInt(100));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable(){
@Override
public void run() {
try {
circularQueue.dequeue();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
t1.start();
t2.start();
t1.join();
t2.join();
}
}