2017-01-17 10 views
2

최근 Apache Commons-IO의 클래스 CountingInputStream을 사용했습니다. 카운터 필드를 업데이트하여 읽은 바이트 수를 계속 추적합니다.InputStream을 동기화하면 어떤 이점이 있습니까?

synchronized 키워드로 카운터를 업데이트 한 것으로 나타났습니다. 내가 찾을 수있는 최고의 소스는 IO-201이지만 그 이유는 설명하지 않습니다.

아파치 코 몬즈 코드가 좋은 품질을 가지고있는 곳을 몇 군데 읽었지만, 지금은 InputStream에서 동기화 된 메소드가 왜 궁금합니다. 스레드 안전이 스트림에서 유용한 속성이라고 생각하지 않으며 IO-201의 주석을 쓰지 않습니다.

내가 InputStream에 동시에 액세스하지 못한다면, 메소드를 동기화 할 유효한 이유가 있습니까? 또는 데이터 쓰레기를 생성하지 않는 InputStream에 동시에 액세스하는 유효한 유스 케이스가 있습니까?

+0

데이터 쓰레기를 가져 오지 않고 InputStream을 동시에 읽는 방법을 생각할 수 없습니다. 그래서 동시성은이 '동기화 된'동기화의 동기가 될 수 없다고 생각합니다. 그러나 어쩌면 그것은 나의 제한된 상상 일뿐입니다. 나는 걱정할 필요가 없다, 나는 그저 뭔가를 배우려는 동기를 이해하기를 원한다. –

+0

알겠습니다. 또 다른 스레드는'getCount()'를 호출 할 수 있습니다. 동기화 작업이 없으면 메모리 모델이 시작되고 다른 스레드는 업데이트를 볼 수 없습니다. 좋아, 만족해. 휘발성 대신에 동기화도 아마 같은 일을 할 것입니다, 그렇죠? –

+0

아니요, 'volatile'변수를 증가 시키면 스레드가 안전하지 않습니다. –

답변

3

동시에 InputStream에 액세스하지 못한다면 그 메소드를 동기화 할 유효한 이유가 있습니까?

아니요, 단일 스레드에서만 액세스하는 개체에 동기화 된 메서드를 사용할 수있는 유효한 이유가 없습니다. 즉, 변경 가능한 상태 (count 필드)를 보호하기 위해 과 동기화되는 제 3 자 코드를 사용하고 있기 때문에 직접 구현하는 것 외의 많은 옵션이 없습니다.

데이터 가비지가 생성되지 않는 InputStream에 동시에 액세스하는 유효한 유스 케이스가 있습니까?

InputStream? 아마도 그렇지 않습니다. CountingInputStream? 물론 ... 한 스레드에서 CountingInputStream.read()을 반복적으로 호출하여 스트림을 소비하고 다른 스레드에서 CountingInputStream.getCount()을 반복적으로 호출하여 UI를 업데이트하여 읽은 행의 수를 표시합니다.