문제

다음 Java 코드는 Windows에서 미개봉 파일의 독점 잠금을 보장합니까?

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {
    public static void main(String[] args) {
        File file = new File("mylog.log");
        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.getChannel().lock();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
.

도움이 되었습니까?

해결책

Java 사양에서 볼 수있는

:

파일 잠금은 전체 Java 가상 시스템을 대신하여 보관됩니다.동일한 가상 컴퓨터 내의 여러 스레드가 파일에 대한 액세스를 제어하는 데 적합하지 않습니다.

스레드에 대한 독점 잠금이 필요하면 다른 방법을 선택하십시오.

다른 팁

TL; DR : 번호. 번호는 잠금 장치의 호스트 운영 체제의 치료의 행동에 대한 가정을 할 수 없습니다.

좋은 소식 : 응용 프로그램 내에서 스레드 안전 잠금 장치가 있는지 확인하려고합니까? 그렇다면 FileLock가 충분합니다 (나머지 응용 프로그램이 제대로 작성된 스레드 안전 코드로 구성되어있는 것으로 가정).

나쁜 뉴스 : 불행히도, Windows가 모든 응용 프로그램을 통해 잠금을 존중할 수 있도록 노력하고있는 경우, 당신은 그에 의존 할 수 없습니다.

Windows에서는 관찰하기 쉽습니다. 기록되는 파일을 덮어 쓰는 파일을 덮어 쓸 수 있습니다 (로그 파일이 너무 길면 Emacs는 이전 스팸을 모두 자릅니다). 그렇다면 Windows는 일반적으로 열려있는 파일을 삭제할 수 없습니다.

발 FileLock 문서 :

파일 잠금은 다음을 대신하여 개최됩니다. 전체 Java 가상 컴퓨터. 그들은 액세스 제어에 적합하지 않습니다 이 내의 여러 스레드에 의한 파일 같은 가상 컴퓨터.

파일 잠금 객체는 사용하기에 안전합니다. 다중 동시 스레드.

... 나중에 ...

잠금이 실제로 여부 다른 프로그램을 방지합니다 잠금의 내용 액세스 지역은 시스템 의존적이고 따라서 불특정. 네이티브 일부 파일 잠금 시설 시스템은 단순히 자문이 있습니다 그 프로그램은 협조해야합니다 알려진 잠금 프로토콜을 관찰하십시오 데이터 무결성을 보장하기 위해 주문하십시오. 의 위에 기타 시스템 원시 파일 잠금 장치입니다 필수 사항은 하나의 프로그램 인 경우 파일의 영역을 잠급니다 프로그램은 실제로 예방됩니다 그 지역에 액세스하는 방식으로 자물쇠를 위반할 것입니다. 아직 다른 것 시스템, 기본 파일 잠금이 있는지 여부 권고 또는 필수는 구성 할 수 있습니다 파일별로. 보장 일관되고 정확한 행동을 완화합니다 플랫폼, 그것은 강력히 권장됩니다 이 API가 제공 한 잠금 장치 자문 자물쇠 인 것처럼 사용됩니다.

잠금을 사용하고 파일의 플래그를 잠금 해제하면 Java 응용 프로그램 내에서 독점 잠금

을 보장합니다.

jni 또는 다른 컴퓨터 언어를 사용하여 Windows 호출을 Windows 파일에서 독점 잠금을 보장하도록합니다.

윈도우 Lockfile 기능

윈도우 UnlockFile 기능

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top