У меня есть большая устаревшая система для обслуживания. Кодовая база использует потоки по всему месту, и эти потоки разделяют множество изменяемых данных. Я знаю, звучит плохо. Во всяком случае, не отвечайте «переписывайте все приложение с нуля» или я проголосую за вас :-) Я попытался запустить некоторые инструменты статического анализа на базе кода, но ни один из них, похоже, не поймает этот случай, который встречается много в нашем исходном коде: несколько потоков - это чтение и запись переменных, которые не помечены как изменчивые или синхронизированные вообще. Обычно это происходит в переменных типа «runFlag». Примером этого является по эффективному Java 2-е издание стр 260:Инструменты для поиска Общедоступные ошибки в Java
public class StopThread
{
private static boolean stopRequested;
public static void main(String[] args) throws InterruptedException
{
Thread backgroundThread = new Thread(new Runnable()
{
public void run()
{
int i = 0;
while (!stopRequested)
{
i++;
}
}
});
backgroundThread.start();
Thread.sleep(1000);
stopRequested = true;
}
}
Этот пример никогда не заканчивается на Windows/Linux с «-Server» параметр запуска данной для Sun JVM. Итак, есть ли какой-либо (полуавтоматический) способ найти эти проблемы, или я должен полностью полагаться на обзоры кода?
FindBugs не обнаруживает «StopThread» -эксперт выше. – auramo 2008-10-09 12:41:27