public class JdbcInterceptor {
private static final JdbcInterceptor instance = new JdbcInterceptor();
private static ThreadLocal<Boolean> dontIntercept = new ThreadLocal<Boolean>();
public static JdbcInterceptor getInstance() {
return instance;
}
public void skipIntercept() {
dontIntercept.set(true);
}
public boolean interrupt() {
boolean di = dontIntercept.get()!=null?dontIntercept.get().booleanValue():false;
if (di) {
dontIntercept.set(false);
}
return di;
}// end interrupt
}// end class
같은 클래스 정의가 그리고 내가 Class2의에서이 작업을 수행
//class1 stuff
JdbcInterceptor.getInstance().skipIntercept();
if(JdbcInterceptor.getInstance().interrupt())
{ // class1 stuff happens
}
이제 다른 클래스 1에서이 작업을 수행
//class2 stuff
if(JdbcInterceptor.getInstance().interrupt())
{ // class2 stuff happens
}
이제 혼란스러워서 수업 1 일이 일어날 것입니다. dontIntercept ThreadLocal. 나의 의심은 class2가 일어날 것인가 아닌가이다. 내 논리는 JdbcInterceptor의 인스턴스가 하나뿐이므로 interrupt()에 대한 모든 호출에서 동일한 상태를 사용할 수 있어야한다는 것입니다. 그러나 ThreadLocals은 각 스레드마다 로컬이라는 말을 들었습니다. 나는 여기서 약간의 갈등을 본다. 이것 좀 도와주세요.
충돌로 인해 클래스의 인스턴스가 하나만있는 것과 다른 멤버 변수 값을 반환하는 것 사이의 충돌을 의미합니다. –
내가 어떻게 설정되어 있는지 보여주기 위해 편집 된 코드는 false로 건너 뜁니다. –
그것이 의도 한 것이면 충돌이 아닙니다. ThreadLocals는 그 목적으로 사용됩니다. 새 코드에서는 class1에서 실행 한 이후 이벤트 시퀀스가 다르다. 값은 항상 'true'로 설정되고, 메소드는 건너 뛰고 'false'로 재설정된다. 새 코드를 사용하면 class1의 코드를 제거하고 class2의 'if'체크를 제거 할 필요가 없습니다. –