读写器Java解决方案查询(条件信号量|传递指挥棒)

读写器Java解决方案查询(条件信号量|传递指挥棒),java,semaphore,Java,Semaphore,我试图在java中实现下面的伪解决方案,作为任务的一部分。伪代码用于读卡器首选项程序,特别是读卡器进程本身。有一个附带的编写过程,但为了保持斯巴达风格,我没有费心粘贴它 Process Reader[i=1 to M] { while (true) { /* Implementing <await (nw == 0) nr = nr+1;> */ P(e); if (nw > 0) {dr = dr+1; V(e); P(r);} nr =

我试图在java中实现下面的伪解决方案,作为任务的一部分。伪代码用于读卡器首选项程序,特别是读卡器进程本身。有一个附带的编写过程,但为了保持斯巴达风格,我没有费心粘贴它

Process Reader[i=1 to M] {
  while (true) {
    /* Implementing <await (nw == 0) nr = nr+1;> */
    P(e);
    if (nw > 0) {dr = dr+1; V(e); P(r);}
    nr = nr + 1;
    if (dr > 0) {dr = dr-1; V(r);}
    else V(e);
    read the database;
    /* Implementing <nr = nr-1;> */
    P(e);
    nr = nr - 1;
    if (nr == 0 and dw > 0) {dw = dw-1; V(w);}
    else V(e);
  }
}
代码其余部分的输出有点混乱,但似乎可以工作。我对thread.sleep使用了延迟,以使控制台的输出更具可读性,而且看起来还可以,尽管我对使用延迟持谨慎态度,因为这很可能会干扰结果,因为我给编写器进程更长的延迟。但从理论上讲,锁定系统应该是可靠的,延迟应该只是让控制台的输出更具可读性

那么,我使用上面的if语句正确吗

你能给我一些关于将数据输出到控制台的提示,以证明它的工作原理符合读者/作者的偏好吗

/* Implementing <await (nw == 0) nr = nr+1;> */
是一个原子过程,下面的代码以原子方式执行

如果有人对另一个问题感兴趣,只需在acquire/release下添加打印语句即可

if (nw == 0) {
  nr = nr++;
  try {
    e.acquire();//P(e)
  } catch (InterruptedException e) {
  }
}//end if
/* Implementing <await (nw == 0) nr = nr+1;> */