gpt4 book ai didi

java - 在 Java 中使用线程时如何安全地递增

转载 作者:行者123 更新时间:2023-11-30 11:15:42 25 4
gpt4 key购买 nike

大家好,我想知道我是否可以得到一些建议,我正在尝试编写一个程序,该程序可以计算有多少线程正在等待处理一个函数,然后一旦达到一定数量,它就会释放所有线程。但我的问题是我不能正确地递增,因为我可以同时处理所有递增代码,因此根本不会递增它。

protected synchronized boolean isOpen()
{
//this code just calls mymethod intrested where the problem lies

lock.interested();
while(!lock.isReady())
{
}
return true;// this statement releases all my threads

}



public synchronized void interested()
{

count++;// how do i make this increment correctly with threads
System.out.println(count+"-"+ lanes+"-"+ThreadID.get());
if(count==lanes)
{

count =0;
ready =true;
}

}

最佳答案

你的方法的问题是一次只有一个线程可以进入 synchronized 方法,因此,你永远不会继续,因为除了第一个线程之外的所有线程都在等待进入 synchronized 方法,而第一个线程正在执行忙等待循环。您必须使用 wait ,这不仅解决了您繁忙等待的 CPU 周期浪费,而且还将释放 synchronized 代码的关联锁,以便下一个线程可以继续:

protected synchronized boolean isOpen()
{
lock.interested();
while(!lock.isReady())
{
wait(); // now the next thread can enter isOpen()
}
notify(); // releases the previous thread wait()ing in this method
return true;
}

但是请注意,由于您的代码被拆分为多个不同的对象,因此这种方法非常不可靠。强烈建议将维护计数器的代码和实现等待计数器的代码放在一个对象中,以便在同一个锁下运行。您的代码结构必须确保 interested() 不会在 lock 实例上被调用而 isOpen 没有注意到。从您发布的两个代码片段,无法推断是否是这种情况。

关于java - 在 Java 中使用线程时如何安全地递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25231531/

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