Существует правило, чтобы узнать, какие объекты могут иметь одновременный доступ в программе Java? - PullRequest
0 голосов
/ 20 августа 2010

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

Ответы [ 6 ]

5 голосов
/ 20 августа 2010

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

public static boolean canBeAccessedConcurrently(Object arg){
        return true;
}
2 голосов
/ 22 августа 2010

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

2 голосов
/ 20 августа 2010

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

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

2 голосов
/ 20 августа 2010

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

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

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

1 голос
/ 20 августа 2010

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

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", имеет одновременный доступ - потому что вы можете запустить приложение несколько раз в разных потоках, и вы никогда не узнаете, какой класс запущен (информация скрыта в строке буквально) и какие другие классы могут быть созданы.

1 голос
/ 20 августа 2010

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

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

...