发布于2024-12-03 10:18 阅读(149) 评论(0) 点赞(0) 收藏(1)
我有这段代码
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之后都有两个线程尝试执行此方法?
如果是这样,那么一个线程是否不能进入 Sum2Elements,在另一个线程进入 InsertElement 之前将标志更改为 true,从而跳过 while 循环?
谢谢
锁是针对类的对象而不是针对任何特定的同步方法获得的。这两种方法都是实例方法。因此,如果其中一个线程已进入某个对象的任何同步方法,例如 A,那么任何其他线程都不能进入该对象的任何同步方法,直到正在运行的线程不调用notifyAll()
方法。在此阶段,所有等待线程都会竞争成为活动线程,但这取决于线程调度程序来选择要成为活动线程的线程。
如果您希望两个不同的线程同时访问这些同步方法,那么这两个线程应该对该类的两个不同对象进行操作。
作者:黑洞官方问答小能手
链接:http://www.javaheidong.com/blog/article/694206/0d8138496d24b3d894a8/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!