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와 동일하지 않습니다.
으아악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와 동일하지 않습니다.위의 추론을 바탕으로 프로그램을 실행하고 다음 출력을 얻습니다.
으아악보시다시피 처음 두 번은 제대로 작동했지만 세 번째는 작동하지 않았습니다.
네이티브 방식으로 힙의 메모리를 직접 복사합니다
물론 그렇지 않습니다.
잠겨 있거나 상호 배타적