gpt4 book ai didi

Java多线程与等待和通知

转载 作者:太空宇宙 更新时间:2023-11-04 07:36:27 24 4
gpt4 key购买 nike

我有这段代码

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,这样就让每个人都等待。

我知道在同步代码中,只有一个线程可以做它的事情,这里我有两个同步方法,这是否意味着在每个notifyall之后有2个线程试图执行这个方法?

如果是这样,一个线程是否不可能进入 Sum2Elements,在另一个线程进入 InsertElement 之前将标志更改为 true,从而跳过 while 循环?

谢谢

最佳答案

只有一个线程可以持有该对象的锁。然后只有该线程可以进入该对象的同步方法。

但是,线程可以通过调用 Object.wait() 释放锁而不从方法返回。

所以你的代码看起来不错!

does it mean that 2 threads are trying to conduct this methods after each notifyall? 
Ans : It is very much possible for two threads to be in two of your synchronized methods since you are calling wait().

is it not possible for one thread to enter Sum2Elements, change the flag to true before the other thread enters InsertElement, and by that skipping the while loop?
Ans : Yes this is possible again for the same reason specified above.

关于Java多线程与等待和通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16784549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com