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

スレッド間で共有されるLockを使用します。

常に 1 つのスレッドだけがロックを保持するため、読み取りスレッドがロックを解放したときにのみ、書き込みスレッドがファイルに書き込むようにします ( finally ブロックで! ) 。

于 2012-05-07T11:57:31.840 に答える
0

1 つは読み取り用、もう 1 つは書き込み用で、その間に 1 つのユニットしかない 2 つのセマフォを使用します。read メソッドは、読み取りセマフォを待機してから読み取りを行い、次に書き込みセマフォに通知します。ライターは、書き込みセマフォを待機してから書き込みを行い、次に読み取りセマフォにシグナルを送ります。

于 2012-05-07T12:09:07.403 に答える
0

から何かを必ず使用してjava.util.concurrentください。CountDownLatchここでは 2 つの esを提案します。cdl1.countDownandを呼び出す前に、1 つのスレッドで書き込みが行われcdl2.awaitます。読み取りスレッドは反対のことを行います。

于 2012-05-07T11:59:05.173 に答える
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
  }
}
于 2012-05-07T12:28:48.447 に答える