Итак, у меня есть этот метод:
public static synchronized int getFilesTaken() {
int filesTaken = (int) Math.ceil(1.0 * filesLeft / threadsLeft);
filesLeft -= filesTaken;
threadsLeft--;
fileIndex += filesTaken;
return filesTaken;
}
filesLeft
, threadsLeft
и fileIndex
- все глобальные переменные, используемые для перебора глобальной File[]
Тогда у меня есть этот метод, который вызывается при запуске потока:
public static void parseFiles() {
int filesTaken = (int) Math.ceil(filesLeft / threadsLeft);
long a = System.currentTimeMillis();
int fileIndexTemp = fileIndex;
int filesTaken = getFilesTaken();
System.out.println(fileIndexTemp);
//rest of the implementation unimportant
}
Я думал, что синхронизация сделает это так, что только один поток сможет одновременно обращаться к глобальным переменным и изменять их. Тем не менее, строка печати печатает одни и те же числа в каждой нити. Если у меня есть 1000 filesLeft и 4 threadsLeft, fileIndexTemp
, который начинается с 0 в начале программы, почти всегда печатает 0, иногда печатая 250, 500 или 750, вместо того, чтобы печатать 0, 250, 500 и 750.
Правильно ли я синхронизировал, и если нет, как я могу решить эту проблему?