java并发问题
想自己编了一个MyCyclicBarrier类,主要在await()方法内部对实例的count执行-1操作,在每个MyCyclicBarrier实例化的时候,新建一个守护线程(CheckAndRelease的实例),该实例run方法内部执行循环检查,当发现count值被减到0,则将count值复位,并执行一个善后runnable(这种一般是执行搜集数据等操作,为了简单起见,我只是用它打印一行字),最后通过notifyAll()唤醒所有等待MyCyclicBarrier 实例锁的线程。
问题是,在MyCyclicBarrier的await()方法中,如果用while循环检查count的值,程序运行结果达不到目标,将while改为if,则结果正确,请问什么原因?
问题是,在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();
}
}
}
}
}
...全文
相关推荐
JAVA如何解决并发问题
解决并发问题是JAVA语言中非常重要的一方面,需要深入了解并发问题的根源,并且了解各种解决方案,以便更好地编写高效、可靠的JAVA程序。
java并发问题概述
Java并发问题概述Java并发问题概述是指多个进程或线程同时访问同一资源时产生的问题。例如,两个操作员同时操作同一账户,导致账户余额的不确定性。
DiningPhilosophers:经典的并发问题,用Java解决
在这个Java实现的版本中,我们探讨如何利用Java的并发工具来解决这个问题。
JAVA并发多线程的面试问题及答案-java多线程并发面试题.docx
JAVA并发多线程面试问题及答案JAVA并发多线程是Java技术面试中面试官比较喜欢问的问题之一。
Java并发的CAS原理与ABA问题的讲解
Java并发编程中的CAS(Compare and Swap)是一种无锁同步机制,它是实现线程安全的关键技术。CAS操作包含三个参数:内存地址V、预期原值A和新值B。


