2010-03-11 2 views
4

Следующий класс не поточно- (как доказано в Proving the following code not thread safe)Thread рамки безопасности

Есть ли рамки, что там может помочь либо во время компиляции/запуска анализа времени и рассказать нам о том, что следующее не поточно безопасно?

Для времени компиляции, в идеале, в Eclipse появляется подчеркнутое подчеркивание и говорит нам, что класс не является потокобезопасным?

В течение времени выполнения, любой статический анализ кода улавливает класс как не потокобезопасный?

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.

Проблема в том, что у вас есть race condition, потому что ваша проверка: instance - null и присвоение значения. Одним из путей решения этой проблемы, что мне нравится в Java является:

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

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

Как это работает в том, что внутренний класс не инициализирован, пока он не ссылается (который получает вас вашу отложенную загрузку) и загружая класс является атомарным и потокобезопасная работа.

Однако существуют и другие действующие решения.

+1

Это не проверил замок. Прочтите статью, которую вы связали более тщательно ... –

0

Хотя прошло много времени с тех пор, как этот вопрос был задан или ответил, сегодня я столкнулся с этим вопросом во время поиска в google.

Есть ли рамки, что там может помочь либо время компиляции /запустить анализ времени и рассказать нам о том, что следующее не поточно?

www.contemplateltd.com, они разработали усовершенствованный инструмент статического анализа. Но это не бесплатно.

Для компиляции, в идеале затмить волнистое подчеркивание приходит и говорит нам о том, что класс не является потокобезопасным?

http://www.checkthread.org/index.html, это проект с открытым исходным кодом вы можете увидеть примеры here

 Смежные вопросы

  • Нет связанных вопросов^_^