본문 바로가기
프로그래밍 놀이터/안드로이드, Java

병렬 프로그램을 위한 어노테이션

by 돼지왕 왕돼지 2015. 7. 20.
반응형

 병렬 프로그램을 위한 어노테이션


클래스 어노테이션


-
@Immutable, @ThreadSafe, @NotThreadSafe.


-
@Immutable 어노테이션은 해당 클래스가 불변(immutable) 클래스임을 나타낸다.
자동적으로 @ThreadSafe 이기도 하다.


-
@NotThreadSafe 어노테이션은 해당 클래스가 스레드 안전성을 확보하지 못하고 있다는 의미이다.
스레드 안전성을 확보했다는 어노테이션을 달지 않은 모든 클래스는 당연하게 @NotThreadSafe 이기 때문에 꼭 사용해야만 하는 것은 아니다.
다만 한눈에 알아볼 수 있도록 하려면 @NotThreadSafe 어노테이션을 달아두는 편이 좋다.


-
어노테이션은 상대적으로 방해되는 부분이 적으면서 클래스 사용자나 유지보수 담당자 모두에게 이득이 있다.
사용자는 해당 클래스가 스레드 안전성을 확보했는지 단번에 알아볼 수 있고,
유지보수 담당자는 스레드 안전성을 계속해서 유지해야 하는지를 명확하게 알 수 있다.


-
개발 관련 도구에서도 이런 어노테이션을 유용하게 사용할 수 있다.
정적인 코드 분석 도구는 어노테이션이 달려 있는 코드가 어노테이션의 의미에 맞게 구현되어 있는지,
예를 들어 @Immutable 어노테이션이 달려 있는 클래스가 실제로 변경 불가능한지의 여부 등을 확인할 수 있을 것이다.



필드와 메소드 어노테이션


-
락을 사용하는 모든 클래스는 어떤 상태 변수를 어떤 락으로 보호하고 있는지에 대한 설명을 문서에 포함시켜야 한다.
부실한 설계로 인해 스레드 안전성 확보에 실패하는 대부분의 경우를 보면, 애초에는 락을 사용해 안정적으로 상태 변수를 보호하고 있었지만
유지보수 과정에서 상태 변수가 추가되거나 변경되었을 때 해당하는 부분을 락으로 적절하게 보호하지 못했기 때문일 수도 있고,
아니면 메소드를 추가하면서 사용하는 상태 변수를 적절하게 동기화하지 못한 원인이 있을 때도 있다.


-
어느 상태 변수를 어느 락으로 보호하고 있는지에 대한 정보를 문서에 명확하게 표시해두면 이와 같은 종류의 문제점을 막을 수 있는 중요한 자원이 된다.


-
@GuardedBy(lock) 어노테이션은 해당 필드나 메소드를 사용하려면 반드시 지정된 락을 확보한 상태에서 사용해야 한다는 점을 의미한다.
lock 인자는 해당 필드나 메소드를 사용하려 할 때 반드시 확보해야 할 락을 의미한다.
lock 인자로 지정할 수 있는 값에는 아래와 같은 것들이 있다.

@GuardedBy("this")

@GuardedBy("fieldName")
@GuardedBy("methodName()") // 결과로 받아온 객체에 대한 암묵적인 락을 확보
@GuardedBy("ClassName.class")



-
@GuardedBy 어노테이션을 사용하면 락을 사용해야 할 상태 변수에 어떤 것이 있는지 한눈에 알아볼 수 있기 때문에
코드를 유지보수하는 입장에서 굉장히 중요한 정보이고, 자동화된 코드 분석 도구에서 잠재적인 스레드 안전성 관련 오류를 찾아내도록 도와줄 수 있는 기본 자료가 된다.




반응형

댓글