Java로 클라이언트 서버 응용 프로그램을 만들고 있습니다. 간단히 말해, 서버에는 몇 가지 파일이 있습니다. 클라이언트는 서버로 파일을 전송할 수 있으며 클라이언트는 서버에서 모든 파일을 다운로드하도록 요청할 수 있습니다. 서버와 클라이언트가 통신 할 수 있도록 RMI를 사용 중이며 RMI IO 라이브러리를 사용하여 클라이언트와 서버간에 파일을 보냅니다.Java 동시성 (읽기/쓰기)
일부 예제 코드 :
서버 :
class Server implements ServerService {
// private Map<String, File> files;
private ConcurrentHashMap<String, File> files // Solution
// adding a file to the server
public synchronized void addFile(RemoteInputStream inFile, String filename)
throws RemoteException, IOException {
// From RMI IO library
InputStream istream = RemoteInputStreamClient.wrap(inFile);
File f = new File(dir, filename);
FileOutputStream ostream = new FileOutputStream(f);
while (istream.available() > 0) {
ostream.write(istream.read());
}
istream.close();
ostream.close();
files.put(filename, f);
}
// requesting all files
public requestFiles(ClientService stub)
throws RemoteException, IOException {
for(File f: files.values()) {
//Open a stream to this file and give it to the Client
RemoteInputStreamServer istream = null;
istream = new SimpleRemoteInputStream(new BufferedInputStream(
new FileInputStream(f)));
stub.receiveFile(istream.export());
}
}
이 보여 그냥 몇 가지 예제 코드이므로주의 해주십시오.
제 질문은 서버의 파일에 대한 동시 액세스에 관한 것입니다. 보시다시피, addFile
메서드는 synchronized
으로 만들었습니다. 내 서버의 리소스를 수정하기 때문입니다. 내 requestFiles
방법은 이 아니며synchronized
입니다.
이것이 문제가 될 수 있는지 궁금합니다. 클라이언트 A가 파일을 추가하고 클라이언트 B가 동시에 모든 파일을 요청하거나 그 반대 인 경우 문제가 발생합니까? 아니면 synchronized
이기 때문에 addFile
메서드가 대기 할 것입니까 (다른 메서드가 대기 할 것입니까?)?
미리 감사드립니다.
디자인에서 파일을 덮어 쓸 수도 있습니다. 당신은 Map을 동기화하도록 만들 생각이십니까? (당신이 언급 한 stackoverflow 질문에서와 같이) – JNevens
나는 ConcurrentHashMap을 사용할 것이고 put 작업은 원자 적이며 읽기 작업은 휘발성 변수를 읽는 것으로 동작합니다. ConcurrentHashMap 파일 = 새로운 ConcurrentHashMap (); –
GoldenJam
감사합니다. – JNevens