我有这段代码
public MultiThreadedSum(ArrayBuffer ArrayBufferInst)
{
this.ArrayBufferInst = ArrayBufferInst;
Sum = 0;
Flag = false;
StopFlag = false;
}
public synchronized void Sum2Elements()
{
while(Flag)
{
try {wait();}
catch (InterruptedException e){}
}
Flag = true;
if (StopFlag)
{
notifyAll();
return;
}
System.out.println("Removing and adding 2 elements.");
Sum = ArrayBufferInst.Sum2Elements();
notifyAll();
}
public synchronized void InsertElement()
{
while(!Flag)
{
try {wait();}
catch (InterruptedException e){}
}
Flag = false;
if (StopFlag)
{
notifyAll();
return;
}
System.out.println("Inserting the sum.");
ArrayBufferInst.InsertElement(Sum);
if (ArrayBufferInst.RetunrSize() == 1)
{
StopFlag = true;
}
System.out.println(ArrayBufferInst);
notifyAll();
}
如您所见,我首先将 Flag 设置为 false,以便其中一个线程可以进入 Sum2Elements 方法并将其更改为 true,然后让每个人都等待。
我知道在同步代码中,只有一个线程可以做它的事情,这里我有两个同步方法,这是否意味着 2 个线程在每个 notifyall 之后都试图执行这个方法?
如果是这样,一个线程是否不可能进入 Sum2Elements,在另一个线程进入 InsertElement 之前将标志更改为 true,然后跳过 while 循环?
谢谢