code inspection 위반 관련 문의 - volatile
- 작성자 :
- 손*철
- 작성일 :
- 2017-11-30 12:53:34
- 조회수 :
- 1,045
- 구분 :
- 공통컴포넌트
- 진행상태 :
- 완료
Q
안녕하세요.
egovframework-all-in-one_v3.6.0 에 포함되어 있는 EgovTimedSocket 클래스에 volatile 사용에 대해 문의드립니다.
해당 클래스가 제가 사용하는 code inspection rule에 '사용금지'로 check되어서요.
또한, 아래와 같이 권고하고 있습니다.
해당 코드를 변경하면 안될..까요..??
'멀티스레드 환경에서 long, double 등의 64bit 길이의 타입에 값을 입력시 스레드 경쟁으로 인해 잘못된 값이 들어 갈 수 있습니다.
그런 오류를 방지하기 위해 volatile 를 사용합니다만 volatile을 사용한다고 해결되지 않고 근본적으로 스레드가 안전하게 설계되어야 합니다.
스레드 안전하게 작성하면 volatile를 쓸 이유가 없으며, 개발자으 착각을 줄이기 위해 volatile 을 사용하지 않는 것을 추천합니다.
[해결방안]
1.Java 1.5이상부터 지원하는 java.util.concurrrent 패키지의 AtomicLong 등의 클래스 사용
2. synchronized 블록을 이용해서 스레드 안전하게 작성
'
egovframework-all-in-one_v3.6.0 에 포함되어 있는 EgovTimedSocket 클래스에 volatile 사용에 대해 문의드립니다.
해당 클래스가 제가 사용하는 code inspection rule에 '사용금지'로 check되어서요.
또한, 아래와 같이 권고하고 있습니다.
해당 코드를 변경하면 안될..까요..??
'멀티스레드 환경에서 long, double 등의 64bit 길이의 타입에 값을 입력시 스레드 경쟁으로 인해 잘못된 값이 들어 갈 수 있습니다.
그런 오류를 방지하기 위해 volatile 를 사용합니다만 volatile을 사용한다고 해결되지 않고 근본적으로 스레드가 안전하게 설계되어야 합니다.
스레드 안전하게 작성하면 volatile를 쓸 이유가 없으며, 개발자으 착각을 줄이기 위해 volatile 을 사용하지 않는 것을 추천합니다.
[해결방안]
1.Java 1.5이상부터 지원하는 java.util.concurrrent 패키지의 AtomicLong 등의 클래스 사용
2. synchronized 블록을 이용해서 스레드 안전하게 작성
'
A
안녕하십니까, 손영철님
표준프레임워크센터입니다.
volatile은 변수를 메모리에 위치시켜 멀티 쓰레드 환경에서
캐쉬에서 메모리로 미쳐 가지 못한 상황에서 변수의 불일치를 개선하는게 핵심입니다.
java 1.5미만의 경우 volatile이 지정된 곳만 관리해주고
java 1.5이상에서는 포함된 변수도 관리해주는게 특징입니다.
멀티쓰레드에서 atomic을 지원하는 클래스를 사용하는것도 방법이고
빠른 속도를 요구하지 않는다면 sychronized를 사용하면 안전하게 처리할수는 있습니다.
다만 sychronized는 다른 쓰레드를 잠시 정지 시키므로 효율관련 손실이 있을수 있으니 참고하셔야 합니다.
감사합니다.
표준프레임워크센터입니다.
volatile은 변수를 메모리에 위치시켜 멀티 쓰레드 환경에서
캐쉬에서 메모리로 미쳐 가지 못한 상황에서 변수의 불일치를 개선하는게 핵심입니다.
java 1.5미만의 경우 volatile이 지정된 곳만 관리해주고
java 1.5이상에서는 포함된 변수도 관리해주는게 특징입니다.
멀티쓰레드에서 atomic을 지원하는 클래스를 사용하는것도 방법이고
빠른 속도를 요구하지 않는다면 sychronized를 사용하면 안전하게 처리할수는 있습니다.
다만 sychronized는 다른 쓰레드를 잠시 정지 시키므로 효율관련 손실이 있을수 있으니 참고하셔야 합니다.
감사합니다.