2012-05-07 53 views
1

我想通过线程读取和写入同一个文件。通过多线程读写文件

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

,我提出的解决办法是:

class XYX { 

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

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

请让我知道你的想法

我想保留这个订货

读 - 写 - 读 - 写 - 读 - 等等

+0

有了这个代码没有将突破第二个线程之前写*的第一个线程读完。 –

回答

2

我会使用线程之间共享的Lock

由于只有一个线程将保持在任何特定时间的锁定,您将确保写入线程只会写文件时读线程释放了锁(在finally块!

+0

我同意你的意见,这可能是可能的,但同步也是我们实现同样的目标。是不是? –

+0

停止读取,(或写入),释放锁的线程,循环并在另一个线程之前重新获取锁? –

+0

当我回答时,没有循环限制,所以我的答案就会成立。这样,你将不得不创建一些额外的样板来知道线程*是否可以锁定锁(基本上,如果它是该线程的话)。 – pcalcao

0

绝对使用java.util.concurrent。我会在这里建议两个CountDownLatch es。在调用cdl1.countDowncdl2.await之前,在一个线程中发生写入;阅读线程完全相反。

+0

你说的是线程同步还是这种订购阅读 - 写作 - 阅读 - 写作 - 阅读 –

+0

我在谈论订购。顺便说一句,你可能意味着写读写读。如果你不先写信,你会读什么? –

+0

是的,你可以采取任何方式...你可以说有一些东西已经可用在文件中..我只关心顺序...它可以是读写,只读或写 - 读-Write-Read –

0

我会用两个信号量来读取,一个用于写入,它们之间只有一个单位。 read方法等待读取的信号量,然后读取,然后发出写入信号量的信号。作者等待写入信号量,然后写入,然后发出读取信号量的信号。

0

如果读,然后写总序必须保持那么它是最容易使用的显示器:

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 
    } 
} 
+0

因为它使用底层接口,所以它不是最简单的方法。这需要所有常用的成语 - 在循环中等待,使用notifyAll并且不通知...这就是为什么我们有'java.util.concurrent'同步器。 –

+0

你不认为writerWaits应该是挥发..只是一个问题 –

+0

@SAM:我已经做到了。 :)从技术上讲,如果只在同步区域内进行更改,则隐式内存隔离应确保该值在释放锁定时保持最新。 – Tudor