У меня есть большая устаревшая система для поддержки. Кодовая база использует потоки по всему месту, и эти потоки разделяют множество изменяемых данных. Я знаю, звучит плохо. Во всяком случае, не отвечайте "переписывайте все приложение с нуля" или я проголосую за вас:-) Я попытался запустить некоторые инструменты статического анализа на базе кода, но ни один из них, похоже, не поймает этот случай, который встречается много в нашем исходном коде: несколько потоков - это чтение и запись переменных, которые не помечены как изменчивые или синхронизированные вообще. Обычно это происходит в переменных типа "runFlag". Примером этого является "Эффективное Java 2-е издание", стр. 260:
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 с параметром запуска "-сервера", данным Sun JVM. Итак, есть ли какой-либо (полуавтоматический) способ найти эти проблемы или я должен полностью полагаться на обзоры кода?