2010-08-20 2 views
0

Существует правило, чтобы узнать, наверняка, все объекты, которые могут иметь параллельный доступ в Java-программе? Мое намерение заключается в использовании такого правила, если оно существует, чтобы выяснить, какие классы Java могут иметь одновременный доступ, а затем гарантировать, что они являются потокобезопасными. Это правило может быть очень полезно при проверке большого Java-проекта. Я думал искать статические методы, но я не уверен, что это единственный способ, которым объект может быть доступен для нескольких потоков.Существует правило, чтобы выяснить, какие объекты могут иметь одновременный доступ в Java-программе?

+0

Целью является поиск классов, которые не являются потокобезопасными, но должны быть. Я решил проверить статические методы, потому что это обычный способ предоставить общий объект, например, объекты-объекты и синглтоны. –

ответ

2

Кажется, очень маловероятно, что такая вещь существует как единое правило. Представьте себе следующее:

public void maybeAccessConcurrently(Program x) { 
    if(halts(x)) { 
     accessConcurrentObject(); 
    } else { 
     // don't. 
    } 
} 

Я не знаю о вас, но я не могу умудриться правило, которое не эквивалентно решении Остановки проблемы здесь, особенно не путем простого осмотра типов или деклараций. Я думаю, вы можете обнаружить, что, как и другие методы статического анализа, есть набор свойств, которые вы можете проверить в разумных пределах. Кажется, что Bandera project пытается использовать различные методы проверки модели для проверки свойств параллельного Java-кода. Могут быть другие подобные усилия (все из которых, скорее всего, будут включать проверку модели, учитывая наличие параллелизма).

+0

Набор правил, помогающих обнаруживать классы, которые * могут * терпеть одновременный доступ, тоже поможет. –

+1

Рискуя собрать много, много ложных срабатываний (и некоторые ложные отрицания), вам в этом случае в принципе понадобится построить граф зависимостей, а затем попытаться изолировать непересекающиеся части кода, которые были в разных потоках. Я думаю, что использование некоторого параллельного программного обеспечения для проверки модели, такого как связанное с ним, вероятно, будет намного проще. – Gian

1

Нет, это невозможно определить из поиска сигнатур метода. Нет правила, что только статические методы могут давать проблемы параллелизма.

Также может возникнуть проблема, если два потока обмениваются ссылками на одни и те же объекты, либо напрямую (путем предоставления ссылки на один и тот же объект), либо косвенно (через статические объекты, статические методы, элементы используемых объектов и т. Д.). Не всегда можно обнаружить эти ситуации, используя статический анализ кода.

2

Я думал искать статические методы, но я не уверен, если это единственный способ объект может быть доступны для нескольких потоков.

Нет, статические методы не помогут вам вообще. Вы даже не ограничены объектами. Даже доступ к примитивам не может быть потокобезопасным. Например, увеличение длины может не быть атомной операцией в зависимости от платформы, на которой вы работаете. Афайк, что вы просите, невозможен.

1

Я сомневаюсь, что такое (удобное) правило возможно. Рассмотрим это:

public MyRunnable implements Runnable { 
    public run() { 
    Class.forName("com.example.MainClass").newInstance(); 
    } 
} 

и позже

public class MainClass { 
    public MainClass() { 
    startApplication(); 
    } 

    public static startApplication() { 
    // A huge application is started 
    } 
} 

Теперь каждый класс, который постоянно используется при выполнении приложения «MainClass» имеет одновременный доступ - потому что вы можете запустить приложение несколько раз в разных потоках, и вы никогда не узнаю, какой класс запущен (информация скрыта в строковом литерале) и какие другие классы могут быть созданы.

5

Да, это вполне возможно сделать такое правило,

public static boolean canBeAccessedConcurrently(Object arg){ 
     return true; 
} 
+0

Lol true, true. Хотя вы, возможно, захотите принять объект, чтобы он соответствовал вопросу OP. –

+0

Мне это нравится. Напоминает мне о моем любимом генераторе случайных чисел: http://xkcd.com/221/ :-) –

+0

+1 для веселья :) –

2

Заканчивать статические анализаторы кода FindBugs и PMD.У них есть множество правил, которые помогают найти потенциальные проблемы параллелизма. Оба могут запускаться из командной строки, поэтому вы можете включить их в свою сборку и сломать сборку, если правила нарушены.