2012-05-07 30 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のものを使用してください。私は2つお勧めしますCountDownLatchここに。書き込みは、cdl1.countDowncdl2.awaitを呼び出す前に1つのスレッドで行われます。読み取りスレッドは反対の動作を行います。

+0

あなたはスレッドの同期やこの種類の注文について話していますか?読書 - 書く - 読書 - 書く - 読む –

+0

私は注文について話しています。あなたはおそらく書き込み - 読み取り - 書き込み - 読み取りを意味します。あなたが最初に書いたことがないなら、あなたは何をお読みになりますか? –

+0

はい、あなたはそれをどうにかすることができます...あなたはすでにファイル内に利用可能なものがあると言うことができます。私はその注文について心配しています...それは読み取り - 書き込み - 読み取り - 書き込みまたは書き込み-Write-Read –

0

2つのセマフォを読み込み用に使用し、書き込み用にセマフォを1つだけ使用します。 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

@サム:私はすでにそれを作った。 :)技術的には、同期領域内でのみ変更されている場合、暗黙のメモリフェンスは、ロックが解除されたときに値が最新であることを保証する必要があります。 – Tudor

関連する問題