Существует правило, чтобы узнать, наверняка, все объекты, которые могут иметь параллельный доступ в Java-программе? Мое намерение заключается в использовании такого правила, если оно существует, чтобы выяснить, какие классы Java могут иметь одновременный доступ, а затем гарантировать, что они являются потокобезопасными. Это правило может быть очень полезно при проверке большого Java-проекта. Я думал искать статические методы, но я не уверен, что это единственный способ, которым объект может быть доступен для нескольких потоков.Существует правило, чтобы выяснить, какие объекты могут иметь одновременный доступ в Java-программе?
Существует правило, чтобы выяснить, какие объекты могут иметь одновременный доступ в Java-программе?
ответ
Кажется, очень маловероятно, что такая вещь существует как единое правило. Представьте себе следующее:
public void maybeAccessConcurrently(Program x) {
if(halts(x)) {
accessConcurrentObject();
} else {
// don't.
}
}
Я не знаю о вас, но я не могу умудриться правило, которое не эквивалентно решении Остановки проблемы здесь, особенно не путем простого осмотра типов или деклараций. Я думаю, вы можете обнаружить, что, как и другие методы статического анализа, есть набор свойств, которые вы можете проверить в разумных пределах. Кажется, что Bandera project пытается использовать различные методы проверки модели для проверки свойств параллельного Java-кода. Могут быть другие подобные усилия (все из которых, скорее всего, будут включать проверку модели, учитывая наличие параллелизма).
Набор правил, помогающих обнаруживать классы, которые * могут * терпеть одновременный доступ, тоже поможет. –
Рискуя собрать много, много ложных срабатываний (и некоторые ложные отрицания), вам в этом случае в принципе понадобится построить граф зависимостей, а затем попытаться изолировать непересекающиеся части кода, которые были в разных потоках. Я думаю, что использование некоторого параллельного программного обеспечения для проверки модели, такого как связанное с ним, вероятно, будет намного проще. – Gian
Нет, это невозможно определить из поиска сигнатур метода. Нет правила, что только статические методы могут давать проблемы параллелизма.
Также может возникнуть проблема, если два потока обмениваются ссылками на одни и те же объекты, либо напрямую (путем предоставления ссылки на один и тот же объект), либо косвенно (через статические объекты, статические методы, элементы используемых объектов и т. Д.). Не всегда можно обнаружить эти ситуации, используя статический анализ кода.
Я думал искать статические методы, но я не уверен, если это единственный способ объект может быть доступны для нескольких потоков.
Нет, статические методы не помогут вам вообще. Вы даже не ограничены объектами. Даже доступ к примитивам не может быть потокобезопасным. Например, увеличение длины может не быть атомной операцией в зависимости от платформы, на которой вы работаете. Афайк, что вы просите, невозможен.
Я сомневаюсь, что такое (удобное) правило возможно. Рассмотрим это:
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» имеет одновременный доступ - потому что вы можете запустить приложение несколько раз в разных потоках, и вы никогда не узнаю, какой класс запущен (информация скрыта в строковом литерале) и какие другие классы могут быть созданы.
Да, это вполне возможно сделать такое правило,
public static boolean canBeAccessedConcurrently(Object arg){
return true;
}
Lol true, true. Хотя вы, возможно, захотите принять объект, чтобы он соответствовал вопросу OP. –
Мне это нравится. Напоминает мне о моем любимом генераторе случайных чисел: http://xkcd.com/221/ :-) –
+1 для веселья :) –
Заканчивать статические анализаторы кода FindBugs и PMD.У них есть множество правил, которые помогают найти потенциальные проблемы параллелизма. Оба могут запускаться из командной строки, поэтому вы можете включить их в свою сборку и сломать сборку, если правила нарушены.
Целью является поиск классов, которые не являются потокобезопасными, но должны быть. Я решил проверить статические методы, потому что это обычный способ предоставить общий объект, например, объекты-объекты и синглтоны. –