Передача глобального параметра ввода / вывода в поток Java

У меня есть Java-программа, которая создает потоки, каждый из которых выполняет один и тот же код (один и тот же run()).

Моя главная выглядит так:

    {
                // Create threads   
                GameOfLifeThread[][] threads = new GameOfLifeThread[vSplit][hSplit];        
                for(int i=0; i<vSplit; i++){
                    for(int j=0; j<hSplit; j++){
                        threads[i][j] = new GameOfLifeThread(initalField, ...);
                    }
                }       
                // Run threads      
                for(int i=0; i<vSplit; i++){
                    for(int j=0; j<hSplit; j++){

                    //    threads[i][j].run();
                          (new Thread(threads[i][j])).start();
                    }
                }   

                return ...;
    }

initialField - это глобальный 2D-массив. Каждый поток должен внести в него некоторые изменения. Проблема в том, что после выполнения потоков массив остается неизменным, даже если существует только один рабочий поток. Тем не менее, когда я бегу

threads[i][j].run();

вместо

(new Thread(threads[i][j])).start();

с одним рабочим потоком (т. е. чисто последовательным выполнением основным потоком) initalField изменяется, как и должно.

В чем может быть проблема? Похоже, что элементы массива передаются по значению, но это не может быть так.

Заранее спасибо.

1 ответ

Всего лишь одна догадка:
Ваш initalField должен быть изменчивым, иначе он может быть кэширован потоками и не будет изменен (как просматривается другими потоками), потому что они могут кэшироваться потоком локально.

Это и этот ответ могут объяснить это немного лучше.

Другие вопросы по тегам