У меня есть этот кусок кода
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();
}
Как видите, я сначала установил для флага значение false, чтобы один из потоков мог войти в метод Sum2Elements и изменить его на true, тем самым заставив всех ждать.
Я знаю, что в синхронизированном коде только один поток может делать свое дело, ну вот у меня есть два синхронизированных метода, значит ли это, что 2 потока пытаются проводить эти методы после каждого notifyall?
И если да, то не может ли один поток войти в Sum2Elements, изменить флаг на true до того, как другой поток войдет в InsertElement, и тем самым пропустить цикл while?
Спасибо
volatile
?transient
просто указывает, что поле не должно сериализоваться в классе, реализующем Serializable. - person FThompson   schedule 28.05.2013