Я немного читал об этой конкретной c проблеме, но у меня все еще проблемы с ее пониманием. Я сделал код немного грязным, пытаясь исправить его в довольно неопрятном и неорганизованном состоянии.
Для моей программы я использую многопоточность для анализа массива файлов, где каждый поток принимает объект класса (это) и определенное количество файлов из глобальной переменной File[]
. Указанный подраздел c массива, а также количество файлов, которые принимает каждый поток, разделены в методе main, поэтому «общего доступа» не существует. Метод run
запускает метод, который циклически просматривает каждый файл подраздела потока в переменной File
, и для каждого файла он создает Map<String, Integer>
. После обработки он добавляет карту в другую глобальную переменную, List<Map<String, Integer>>
. Кроме того, он добавляет слова текстового файла в глобальную переменную String[]
.
Так что, хотя мой метод просматривает каждый индекс File[]
, не каждый Map
добавляется к List
глобальная переменная. Однако, если я добавлю оператор System.print
прямо перед строкой, которая добавляет карту в глобальный список, то это сработает.
Поэтому, если я читаю 1000 файлов, некоторые файлы случайным образом пропущено и, возможно, только 989 или 994 файла будут добавлены в список хэш-карт. Однако добавление этого оператора печати гарантирует, что все 1000 файлов находятся там. Я добавил volatile
к этим общим переменным, но это не решает проблему.
Это потому, что они имеют общий доступ к глобальной переменной List<Map<String, Integer>>
и String[]
? Как я могу исправить эту проблему, не жертвуя многопоточностью?