2.1实现事件栅栏原语(30分)
2.1.1事件栅栏的概念
 事件栅栏(EventBarrier)是一种同步机制,使用事件栅栏可以让一组线程以同步的方式等待和应答某事件。
 事件栅栏的调用者分为两类:或者调用Wait操作,或者调用Signal操作。使用事件栅栏,无论是Wait操作的调用者或者是Signal操作的调用者最终都将同步地通过栅栏(如果他们原先不同步,则进度较快的线程将通过使自己阻塞而与进度慢的线程同步)。
 Wait操作的调用者在事件栅栏上等待Signal的发出。
 和信号量类似,Signal操作是可以积累的——没有Waiter的Signal将被记录下来。
 执行Wait操作的调用者在收到Signal后必须应答Signal的发出者——调用Complete操作表示应答结束。
 只有在所有的Wait操作的调用者都已经应答后,它们才能通过事件栅栏。在所有的Wait操作的调用者都已经应答之前,Signal的发出者必须等待,并保持事件栅栏处于“SIGNALED”状态。类似地,也只有在所有的Wait操作的调用者都已经应答后,Signal的发出者才能离开事件栅栏,并恢复事件栅栏的初始状态“UNSIGNALED”。
 只允许一个Signal操作的调用者发出Signal并等待应答。
2.1.2实现事件栅栏的几点注意
 EventBarrier类的接口定义和实现应分别包含在EventBarrier.h和EventBarrier.cc中,请自己新建这些文件,并注意修改Makefile文件nachos-3.4/code/Makefile.common里的有关部分(具体项目可以参考实验一的说明)。
 EventBarrier类的主要外部接口的简要说明请参考nachos-labs.pdf的3.3.1。
 Signal操作的主要步骤:
 设置事件栅栏的状态为SIGNALED
 唤醒所有阻塞于Signal的线程
 阻塞于Complete
 恢复事件栅栏的状态为UNSIGNALED
 Wait操作的主要步骤:
 如果事件栅状态是SIGNALED,则直接返回
 否则,阻塞于Signal
 Complete操作的主要步骤:
 如果是最后一个调用Complete者,则唤醒所有阻塞于Complete的线程
 否则,阻塞于Complete
 建议使用条件变量来实现(因为需要广播)请问一下,这个用Java怎么实现。实在不好意思在CSDN上发作业贴,可是我对线程的理解不很透彻,有谁帮帮忙的~。写下代码,谢谢了~!