2011-09-18 2 views
1

Eclipse에서 "Plugin Project"를 만들면 비동기 정적 필드에 BundleContext를 설정하는 기본 BundleActivator 구현이 생성됩니다.BundleActivator에서 동기화되지 않은 정적 BundleContext 참조를 갖는 것이 정말로 안전한가요?

OSGi가 Activator를 호출 할 때 약간의 동기화를 수행하더라도 getter를 호출 할 코드가 모두 나올 수도 있다는 것을 알기 때문에이 함수는 정적 정적 getter를 생성하므로 스레드로부터 안전하지 않습니다. 동일한 동기화 블록 내에서 실행합니까?

"정상적인"컨텍스트에서는 getter와 setter를 모두 동기화해야하거나, 나중에 Thread가 getter를 호출 할 때 실제로 정적 필드의 현재 상태를 확인하기 위해 volatile을 사용해야합니다.

필드가 한 번만 설정되면 문제가되지 않지만 JVM 수명 동안 번들을 여러 번 시작하고 중지 할 수 있다는 것을 알고 있으며 이러한 조건에서 스레드 이미 캐시 된 버전의 필드가 있으며 동기화가 이루어지지 않아 변경 사항이 표시되지 않습니다.

이클립스가 기본적으로 일반 코드를 생성하는 것을 상상할 수는 없지만 어떻게 작동하는지는 알 수 없다.

답변

2

나는 생성 된 코드가 올바르지 않고 Eclipse PDE이 잘못된 코드를 생성했다는 사실에 놀랐다는 것에 동의한다. 이 정적 필드는 필요 없으며 실제로 대부분의 경우 활성제 자체는 쓸모가 없습니다.

+0

한편 OSGi는 "스레딩"에 대한 보증을 제공하지 않으므로 코드가 스레드로부터 안전하지 않으며 그대로 사용하면 문제가 발생할 수 있습니다. –

관련 문제