2010-03-11 3 views
4
( Proving the following code not thread safe에서 입증 된 바와 같이) 다음 클래스는

스레드 안전 프레임 워크

프레임 워크가 그 중 하나를 컴파일 시간/실행 시간 분석에 도움이 될 수 있습니다 및 스레드 우리를하지 다음은 말할 거기 밖으로-스레드로부터 안전하지 않습니다

안전한?

컴파일 타임에는 이클립스에서 이상적인 밑줄이 나오고 클래스가 스레드로부터 안전하지 않다는 것을 알 수 있습니까?

정적 코드 분석은 클래스를 스레드로부터 안전하지 않은 것으로 간주합니까?

public class LazyInitRace { 
    private ExpensiveObject instance = null; 

    public ExpensiveObject getInstance() { 
    if (instance == null) 
     instance = new ExpensiveObject(); 
    return instance; 
    } 
} 

답변

4

FindBugs은 스레드 동기화가 일치하지 않는 코드 부분을 찾을 수 있습니다. 즉, 한 곳에서 필드에 대한 액세스를 동기화하지만 다른 곳에서는 동기화하지 않습니다. JCIP annotations에 대한 기본 유효성 검사를 수행 할 수도 있지만 @Immutable 만 확인합니다.

이 특정 사례를 자동으로 잡아낼 정적 분석 도구에 대해서는 알지 못하지만 확실한 사례가 있다고 확신합니다.

+0

FindBugs는 전체 "다중 스레드 정확성"카테고리를 가지고 있습니다. –

+0

FindBugs가이 순간에 가장 좋은 옵션이라고 생각합니다. – portoalet

0

이것은 double checked locking problem이라고하는 고전적인 문제입니다.

instance이 0인지 확인하고 값을 할당했는지 확인해야하기 때문에 race condition입니다. 나는 자바에서처럼이 문제를 해결하는 한 가지 방법은 다음과 같습니다이 작품

public class LazyInitRace { 
    private static class Container { 
    public final static ExpensiveObject INSTANCE = new ExpensiveObject(); 
    } 

    public ExpensiveObject getInstance() { 
    return Container.INSTANCE; 
    } 
} 

방법은이 참조 될 때까지 내부 클래스와 클래스를로드하는 원자이다 (당신이 당신의 게으른로드를 얻을 수있는) 초기화되지 않는 것입니다 및 threadsafe 조작.

그러나 다른 유효한 해결책이 있습니다.

+1

를 볼 수 있습니다 오픈 소스 프로젝트입니다. 더 신중하게 링크 된 기사를 읽으십시오 ... –

0

이 질문이 제기되었거나 답변 된 이후 오랜 시간이 걸렸지 만 오늘은 Google에서 검색하는 동안이 질문을 접했습니다.

컴파일 시간이 /런타임 분석에 도움이 될 수있는 프레임 워크가 있습니까? 다음은 스레드 안전하지 않습니까?

www.contemplateltd.com, 그들은 고급 정적 분석 도구를 개발했습니다. 그러나 그것은 자유롭지 않다.

이클립스에서 가장 이상적인 밑줄이 생기고 은 클래스가 스레드로부터 안전하지 않다는 것을 알려줍니다.

http://www.checkthread.org/index.html, 이것은이 예 here이 잠금을 확인을 두 번하지 않는