高洛峰2017-04-18 10:25:09
System.arraycopy
은 native
메서드입니다.
native
메소드와 스레드 안전성 사이에는 필연적인 연관성이 없으며, System.arraycopy
의 문서에 스레드로부터 안전하다는 언급이 없는 것을 보니 线程不安全的
임을 알 수 있습니다.
그러나 System.arraycopy
이 실제로 스레드에 안전하지 않은지 확인하기 위해 다음과 같은 간단한 예를 작성했습니다.
이 예의 구체적인 작업은 다음과 같습니다.
arrayOriginal과 arraySrc는 초기화 시 동일하지만 arrayDist는 모두 0입니다.
스레드를 시작하여 copy()
메소드를 실행하여 arraySrc를 arrayDist로 복사합니다.
은 메인 스레드에서 modify()
작업을 실행하고 arraySrc의 내용을 수정합니다. copy()
작업이 modify()
작업보다 우선하도록 하기 위해 Condition을 사용하고 2밀리초 동안 지연합니다. 복사 작업(예: System.arraycopy)이 수정 작업보다 먼저 실행되는지 확인하세요.
세 번째 점에 따르면 System.arraycopy
이 스레드로부터 안전하다면 먼저 복사 작업을 수행한 다음 수정 작업을 수행해도 복사 결과에 영향을 미치지 않으므로 arrayOriginal은 arrayDist와 같아야 합니다. System.arraycopy
이 线程不安全的
인 경우 arrayOriginal은 arrayDist와 동일하지 않습니다.
위의 추론을 바탕으로 프로그램을 실행하고 다음 출력을 얻습니다.
으아악보시다시피 처음 두 번은 제대로 작동했지만 세 번째는 작동하지 않았습니다.