이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 14222|회답: 0

[통신] Java 및 I++ 스레드 보안의 기본 유형에 대한 통찰

[링크 복사]
게시됨 2015. 4. 5. 오후 10:17:45 | | |

자바에서는 Long과 Double의 8바이트 64비트 변수를 제외하고는 다른 기본 변수들이 원자입니다.


Java 스토리지 모델은 get과 store 모두 원자적 연산을 요구하지만, 비휘발성 롱 및 더블 변수의 경우 JVM은 64비트 읽기 또는 쓰기를 두 개의 32비트 연산으로 나눌 수 있게 합니다.

읽기와 쓰기가 서로 다른 스레드에서 이루어지면, 비휘발성 타입의 롱을 읽으면 한 값은 32비트 정도는 높게, 다른 값은 32비트 정도 낮게 나올 수 있습니다.

그래서 만료된 데이터에 신경 쓰지 않더라도, 멀티스레드 프로그램에서 공유되고 변경 가능한 롱 및 더블 변수를 사용하는 것은 불안정하거나 잠금으로 보호되지 않는 한 안전하지 않을 수 있습니다.


원자 연산에 대해 말하자면, 읽기와 쓰기는 원자적이라는 의미로, 예를 들어 i=5; 이건 원자력 작전이야.

하지만 두 원자의 연산이 함께 수행되고, 반드시 원자적인 연산이 아니라면, 예를 들어 먼저 읽고 쓰는 경우, 변수가 읽기 후에 수정되었을 가능성이 있습니다.

i++는 그런 연산으로, 먼저 읽고 쓰기 때문에 정수 변수는 원자(atomic)이지 i++가 원자 연산이라는 뜻은 아닙니다.

for(int i=0; i<10000; i++){System.out.print(i)}

결국 1만 장을 인쇄하지 않고 약 8천에서 9천 장 정도 인쇄할 것입니다.


하지만 멀티스레딩의 경우, 정수 변수가 원자라도 스레드 안전 문제가 발생할 수 있는데, 이는 스레드 가시성 문제이므로 휘발성 명단을 추가해야 합니다.

이 수정자는 매번 메모리에서 읽히는 강제 변수이며 레지스터에 저장되지 않습니다.




이전의:SQL 2008 오류 메시지(제공자: SQL Network Interfaces, 오류: 25 - 연결 단어)가 프롬프트 표시됩니다.
다음:[분노의 질주 7] 2.12G DVD 공개 인터넷에서 가장 선명한 버전
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com