java并发问题

liangwenli2 liangwenli2 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
想自己编了一个MyCyclicBarrier类,主要在await()方法内部对实例的count执行-1操作,在每个MyCyclicBarrier实例化的时候,新建一个守护线程(CheckAndRelease的实例),该实例run方法内部执行循环检查,当发现count值被减到0,则将count值复位,并执行一个善后runnable(这种一般是执行搜集数据等操作,为了简单起见,我只是用它打印一行字),最后通过notifyAll()唤醒所有等待MyCyclicBarrier 实例锁的线程。
问题是,在MyCyclicBarrier的await()方法中,如果用while循环检查count的值,程序运行结果达不到目标,将while改为if,则结果正确,请问什么原因?


import java.util.concurrent.TimeUnit;
public class MyCycliBarrier {

public volatile int count;
public Runnable endWait;
public volatile int realCount;
public MyCycliBarrier(int size,Runnable runnable)
{
this.count = size;
this.realCount = size;
this.endWait = runnable;
CheckAndRelease<MyCycliBarrier> checkAndRelease = new CheckAndRelease<MyCycliBarrier>(this);
new Thread(checkAndRelease).start();
}
public synchronized void await() {

try {
count--;
while(count!=realCount) {
wait();
}
} catch (InterruptedException e) {
Print.p("myCyclicBarrier interrupted");
}
}
public static void main(String[] args)
{

MyCycliBarrier cycliBarrier = new MyCycliBarrier(5, new Runnable() {
@Override
public void run() {
System.out.println("CycliBarrier Over");
}
});
for(int i=0;i<5;i++)
{
new Thread(new MyStringProducer(cycliBarrier)).start();
}

}
}
class MyStringProducer implements Runnable{

MyCycliBarrier myCycliBarrier;
public MyStringProducer( MyCycliBarrier m)
{
this.myCycliBarrier = m;
}
@Override
public void run() {
for(int i=0;i<5;i++)
{
System.out.println(Thread.currentThread()+" "+i);
myCycliBarrier.await();
}
}
}
class CheckAndRelease<T extends MyCycliBarrier> implements Runnable
{
T t;
public CheckAndRelease(T a)
{
this.t = a;
}

@Override
public void run() {
while(!Thread.interrupted())
{

if(t.count==0)
{
synchronized (t)
{
t.count = t.realCount;
new Thread(t.endWait).start();
try {
TimeUnit.NANOSECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
t.notifyAll();
}
}
}
}
}
...全文

相关推荐

评论 2
收藏 已收藏
分享
返回顶部
liangwenli2
Java 51,407 成员 86,129 内容