2012-05-07 4 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을 사용합니다. 하나의 스레드 만이 주어진 시간에 잠금을 보유 것 때문에 읽기 스레드가 잠금 해제했을 때, 당신은 쓰기 스레드는 파일에 쓸 것을 확인 할

(에 를 최종적으로 차단!)

+0

나는 이것이 가능할 수 있다는 것에 동의했다. 그러나 동기화를 통해서도 우리는 같은 것을 성취하고있다. 안 그래? –

+0

무엇이 읽기 (또는 쓰기)를 중지하고, 스레드가 잠금을 해제하고, 반복 루핑하고 다른 스레드 전에 잠금을 다시 획득합니까? –

+0

주기적인 제한이 없다고 대답했을 때 내 대답이 유지 될 것입니다. 이렇게하면 스레드가 * Lock *을 잠글 수 있는지 (기본적으로 해당 스레드의 순서 일 경우) 알 수있는 보일러 플레이트를 추가로 만들어야합니다. – 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

글쓴이가 휘발성이어야한다고 생각하지 않습니까? 그냥 질문이 있습니다. –

+0

@SAM : 이미 만들었습니다. :) 기술적으로 동기화 영역 내에서만 변경된 경우 암시 적 메모리 펜스는 잠금이 해제 될 때 값이 최신인지 확인해야합니다. – Tudor