0

현재 Spring 3에서 Java 6을 사용 중입니다.다중 리더 파일 java

같은 파일을 읽는 일부 프로세스가 있습니다.이 경우 XML 파일입니다.

또한이 프로세스는 날짜를 업데이트해야하는 해당 파일의 내용을 업데이트해야합니다.

프로세스가 동시에 실행되므로 동시에 읽고 쓸 수있는 가능성이 있습니다.

여러 개의 리더와 하나의 작성자가있을 수있는 ReadWriteLock에 대해 들었습니다. 나는 그 순간을 고려 중입니다. 프로세스가 신속하게 실행되기 때문에

프로세스 A가 현재 업데이트를 작성하고 프로세스 B가 대기 중이며 다른 프로세스 C가 업데이트 작성 대기 중일 수 있습니다. 프로세스 B가 동일한 요소를 업데이트하는 경우 프로세스 B는 이전 업데이트 일 수 있습니다.

어떻게 이것을 수행 할 수 있습니까?

감사합니다.

+3

동일한 파일에 액세스하는 여러 개의 * 프로세스 * 또는 동일한 파일에 액세스하는 여러 개의 * 스레드 *가 있습니까? 프로세스보다는 스레드에 대해 다른 접근법을 사용할 수 있습니다. –

+0

해머 (멀티 스레딩)가 못을 만납니다 (단일 파일 쓰기). –

+1

파일이 예외적으로 큰 경우가 아니면 메모리에 보관하지 않으려 고 할 이유가 없습니다. 동시 업데이트/읽기를 위해 두 개 이상의 프로세스간에 파일을 공유하려고 시도하는 경우 디자인은 단순한 오류입니다. – bestsss

답변

1

모든 "프로세스"가 스레드 인 경우 동기화를 사용하십시오. 그것이 정확히 무엇을위한 것입니다. ReadWriteLock은 파일 자체를 보호하지 않습니다. 메모리에있는 객체에 대한 공유 액세스를 조정하기위한 것입니다. 이 의사 코드 같은

뭔가 :

class XmlDatabase { 

Document doc = readXml(); 

synchronized Date readDate() { 
    Date _date = getDateFromDoc(doc); 
    return _date; 
} 

synchronized void writeDate(Date _date) { 
    addDateToDoc(_date); 
    writeDocToFile(doc); 
} 

}

는 많은 사람들이 당신이 대규모 동시로 의미가 뭔가를 구현하지 않는 한 그 동기화 등을 천천히 당신을 말할 것이다 동기화 프리미티브를 사용하면 정상적으로 작동합니다. 필요한 경우 나중에 java.util.concurrent로 최적화 할 수 있습니다. 단순한 동기화를 사용하는 단순성과 가독성은 그만한 가치가 있습니다. 다른 프로세스가 데이터에 액세스 할 수있게하려면 RMI 또는 기타 네트워킹 솔루션으로 데이터베이스 클래스를 래핑하면됩니다.

+0

잠금 장치는 일반적으로 조정을위한 것입니다. ReadWriteLock은 메모리를 보호하는 것보다 더 좋거나 나쁘지 않은 파일을 보호합니다. 리더와 작가가 동시에 잠금 장치를 보유하지 않도록합니다. * 읽고 쓰는 것은 무엇이든 될 수 있으며 자물쇠는 상관하지 않습니다. – Karmastan