1

我想通过线程在同一个文件中读写。

但条件是当第一个线程完成读取时,另一个线程应该写入。

我提出的解决方案是:

class XYX {

  public void read(){
    synchronised(fileObj){
      //write the reading logic
    }
  }

  public void write(){
    synchronised(fileObj){
      //write the writing logic 
    }
  }
}

请让我知道你的想法

我想保留这个订单

阅读 - 写作 - 阅读 - 写作 - 阅读 - 等等

4

4 回答 4

2

我会使用线程之间共享的锁。

由于在任何给定时间只有一个线程会持有锁,因此您将确保写入线程仅在读取线程释放锁时才写入文件(在 finally 块上!

于 2012-05-07T11:57:31.840 回答
0

我会使用两个信号量,一个用于读取,一个用于写入,它们之间只有一个单元。read 方法等待读取信号量,然后读取,然后向写入信号量发出信号。写入器等待写入信号量,然后写入,然后向读取信号量发出信号。

于 2012-05-07T12:09:07.403 回答
0

如果必须保持 read-then-write 的总顺序,那么使用监视器是最简单的:

class XYX {

  private final Object fileObj = new Object();
  private volatile boolean writerWaits = true;

  public void read(){
    // read from file
    synchronized(fileObj){
        writerWaits = false;
        fileObj.notify(); // signal the writer to begin
    }
  }

  public void write(){
    synchronized(fileObj){
        while(writerWaits)
           fileObject.wait(); // wait for signal from reader
    }
    // write to file
  }
}
于 2012-05-07T12:28:48.447 回答
0

绝对使用来自java.util.concurrent. 我建议CountDownLatch在这里使用两个 es。cdl1.countDown在调用and之前,写入发生在一个线程中cdl2.await;阅读线程则相反。

于 2012-05-07T11:59:05.173 回答