2017-05-22 15 views
1

나는
내가
그래서 내가이 있는지 알고 싶어 각 스레드에 대한 방법을 BufferedImage의 다른 인스턴스와
ImageIO.write(bufferedImage, 'jpg', new File(...))
를 호출 할 수 있습니다 javax.imageio의 패키지에서 ImageIO에서 클래스의 쓰기 방법에 대해 질문이 있습니다 스레드 안전 또는 내 경우에는 없습니다. 그리고이 방법이 스레드로부터 안전 할 수있는 이유는 무엇입니까? 미리 감사드립니다!ImageIO.write는 여러 스레드에서 호출 했으므로 안전합니까?

편집 : @yshavit는, 그래 그것은 다른 파일 내가 그것을 읽고 다른 스레드에 대한
에 쓰기 위해, 그러나 그것은 haraldK 말한다 안전 으로 확인 스레드 수 이유를 아주 잘 이해하지 못했다. 당신이 다른 bufferedImage 모든 기록과 함께 여러 스레드에서 ImageIO.write(...)를 호출하려고처럼

+0

나는 그것이 의심 스럽지만 확실하지 않습니다. 일반적인 기술은 tmp 위치에 작성한 다음 이동하려는 위치로 이동하는 것입니다.이 파일은 종종 원자 파일 시스템이나 원자 파일 시스템으로 가져 오는 것입니다. – yshavit

+0

동일한 파일에 쓰려고하지 않는다면 왜 이것이 스레드로부터 안전하지 않은지 알 수는 없습니다. –

+0

아, 네. 나는 같은 파일에 글을 쓰려고했다. OP, 너 분명히 해줄 수 있니? – yshavit

답변

1

나는 방법 ImageIO.write(bufferedImage, 'jpg', new File(...)) ... 나는 그것이 스레드 안전 있는지 알고 싶어 ...

는 소리를 호출 할 수 있습니다 같은 File. 이것은 코드가 "스레드 안전"이라는 측면에서 문제가되지는 않습니다. 서로 다른 스레드에서 다른 bufferedImage을 사용하여 호출하면 메모리 덮어 쓰기 문제 또는 스레드에서 일반적으로 걱정하는 다른 문제가 발생하지 않습니다.

그러나 잘못된 이미지 파일을 생성 할 수있는 경쟁 조건이 있습니다. FileImageOutputStream에서 2 개의 스레드가 동시에 같은 RandomAccessFile에 쓰는 경우 다른 스레드에서 작성된 다른 섹션이있는 스레드의 파일 섹션을 얻을 수 있습니다.

나는 각 스레드가 자신의 임시 파일에 기록하는 것이 좋습니다 다음 제자리에에게 파일의 이름을 변경 : 원자 작업입니다

// write to temporary file with thread-id suffix 
File tempFile = 
    new File(destinationDirectory + fileName + Thread.currentThread().getId() + ".t"); 
ImageIO.write(bufferedImage, 'jpg', tempFile); 
// rename into place 
tempFile.rename(new File(fileName)); 

File.rename(...) 방법. 이름 바꾸기를 호출하는 두 번째 스레드가 첫 번째 스레드의 출력을 삭제하지만 손상된 이미지에서 사용자를 저장한다는 사실에서 벗어나지는 못합니다.

+0

답변 해 주셔서 감사합니다. 제 경우에는 bufferedImage를 다른 파일에 저장하기 때문에 경쟁 조건에 문제가 없습니다. 내 질문은 2 스레드 (또는 그 이상)가 동시에 실행되는 시나리오에 관한 것입니다. 'ImageIO.write (..., ..., ...) '메서드 –