2013-01-08 5 views
1

나는 Aspect 클래스 (spring-aop)를 가지고있다. 나는 어떤 매개 변수를 가져 와서 클래스 필드에 저장하는 한 가지 조언이 있습니다. 두 번째 조언은 이러한 매개 변수를 사용합니다. 그것은 기능 테스트에 사용되며 여러 사용자가 동시에 실행할 수 있기 때문에 thread-safe로 만들어야합니다. 내가 어떻게 해?Java의 Aspect 클래스에서 스레드 안전 캐시를 구현하는 방법은 무엇입니까?

public class SomeAspect { 
    private String parameters; 

    public void saveParameters(JoinPoint jp) { 
     Object[] args = jp.getArgs(); 
     Object firstArg = args[0]; 
     this.parameters= (String) firstArg;  
    } 


    public void useParameters() { 
     doSmth(parameters); 
    } 

}

+1

캠입니다. aspect를 통해 "private Object mutex"필드를 추가 한 다음 동기화 (뮤텍스)합니까? – AlexWien

+0

모든 사용자 스레드가 동일한 매개 변수를 사용하도록 하시겠습니까? 아니면 모든 사용자가 자신의 매개 변수를 갖기를 원합니까? 첫 번째 경우에는 잠금 또는 '휘발성'또는 'AtomicReference'를 사용할 수 있습니다. 두 번째 경우에는'ThreadLocal' 또는 유사한 것을 사용할 수 있습니다. – SamYonnou

+0

두 번째 케이스가 필요합니다. 나는 ThreadLocal을 시도 할 것이다. 감사합니다 –

답변

0

난 당신이 parameters를 저장하는 ThreadLocal를 사용한다고 생각합니다. 문서에 따르면 하나의 요청이 하나의 스레드로 처리되므로 안전해야합니다. 문서는 here

+0

나는 그것에 대해 생각하고 있었지만 스레드 로컬이 일정하기 때문에 실행 조언 중에이 필드에 새로운 값을 설정할 수 있는지 확신하지 못합니다. 어떤 경우에는 필드 값을 개인적인 방법으로 변경할 수 있습니다. 나는 휘발성에 대해 읽었지만, 그것에 대해서는 경험이 없다. –

+0

그러나 메소드에서 매개 변수가 변경되면 매개 변수의 로컬 사본이 변경된다. 나는 당신이 방법 밖의 변화에 ​​접근 할 수 없다고 생각합니다. – partlov

관련 문제