The code below is trying to insert a random value into a circular queue and remove it. However, there are some synchronization issues. I know I can use higher level routines
another problem in this code is that even if isEmpty/isFull return true - until you call the adjacent wait the state of the queue might change.
For example:
- queue is empty
- thread 1 calls isEmpty()
- context switch
- thread 2 calls enqueue (now the queue is not empty)
- context switch
- thread 1 not calls lock.wait() event though the queue is not empty
this problem of course will be solved when calls to wait()/notify() will be placed in a synchronized block.
Because java.lang.Object#wait
, java.lang.Object#notify
, java.lang.Object#notifyAll
must be called from synchronized block.
As a solution(need to check) you should put your conditions inside synchronized blocks:
void enqueue(int number) throws InterruptedException
{
synchronized(lock)
{
if(isFull())
lock.wait();
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
{
synchronized(lock)
{
if(isEmpty())
lock.wait();
int retVal = 0;
retVal = array[front];
System.out.println("Front is:"+ front+ "value is:"+retVal);
front = (front+1)%size;
count--;
lock.notify();
}
}