Java中屏障的实现

3

在Java中,如何使用信号量实现屏障。以下伪代码是否可行?如何使用Java Semaphore类编写它。

N是要等待的线程数。 EveryoneHasReachedBarrier是一个条件变量。

Aquire(mutex)
m = m + 1;
if(m != N)
{ 
    Release(mutex);
    Aquire(EveryoneHasReachedBarrier);
}
else
{
   m = 0;
   Release(mutex);
   for(i=0; i<N; i++)
   {
       Release(EveryoneHasReachedBarrier);
   }
}

1
我们不会替你完成作业。请发布你已经编写的代码,我们会提供帮助。 - Stephen C
2个回答

2

1
啊...但问题的本质是,作为一项作业,OP想知道如何使用Semaphore类来实现这些。 - Stephen C
他可以查看这两个的源代码,并在此过程中学到一些有用的东西。 - biasedbit
1
仅仅靠复制粘贴就无法学到任何东西。理解并发编程的最佳方法是通过自己尝试思考来进行。 - Stephen C

0

1) 你的伪代码没有使用信号量,所以它不是一个解决方案。

2) 它与Java原始互斥锁/等待/通知的工作方式不相符。

3) 它可能根本行不通。因为在获取条件之前释放互斥锁,存在竞态条件的潜在风险。(由于你的“原语”的语义可以有多种解释,这一点并不完全清楚。)

提示:你需要仔细阅读Semaphore类的javadoc,然后尝试将其映射到你要解决的问题上。


@Ajex - 既然这是作业,我的回答是:“好问题。你认为答案是什么?为什么不试试看能否使用一个信号量使其工作?” - Stephen C
我认为单个信号量变量无法追踪多个线程。它无法知道哪些线程已经到来。 - Ajex
那么请尝试使用两个信号量的解决方案。 - Stephen C
哦,好的。你提到的两个中的一个应该是用于互斥,另一个用于计数。 - Ajex
我明白了。我会试一下的。非常感谢你的帮助。现在我感到有动力了。 - Ajex
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接