Вот очень наглядный пример разделения массива между двумя потоками. Обычно вы видите все нули, но иногда все становится странным, и вы видите другие цифры.
final int[] arr = new int[100];
Thread one = new Thread() {
public void run() {
// synchronized (arr) {
for (int i = 0; i < arr.length * 100000; i++) {
arr[i % arr.length]--;
}
// }
}
};
Thread two = new Thread() {
public void run() {
// synchronized (arr) {
for (int i = 0; i < arr.length * 100000; i++) {
arr[i % arr.length]++;
}
//}
}
};
one.start();
two.start();
one.join();
two.join();
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
Но, если вы синхронизируете на arr
в цикле, вы всегда увидите все 0
s в распечатке. Если вы раскомментируете синхронизированный блок, код будет работать без ошибок.