Являются ли java примитивные целые числа (int) атомами вообще, если на то пошло? Некоторые эксперименты с двумя потоками, разделяющими int, как представляется, указывают на то, что они есть, но, конечно, отсутствие доказательств того, что они не являются, не означает, что они есть.
В частности, тест, который я запускал, был следующим:
public class IntSafeChecker {
static int thing;
static boolean keepWatching = true;
// Watcher just looks for monotonically increasing values
static class Watcher extends Thread {
public void run() {
boolean hasBefore = false;
int thingBefore = 0;
while( keepWatching ) {
// observe the shared int
int thingNow = thing;
// fake the 1st value to keep test happy
if( hasBefore == false ) {
thingBefore = thingNow;
hasBefore = true;
}
// check for decreases (due to partially written values)
if( thingNow < thingBefore ) {
System.err.println("MAJOR TROUBLE!");
}
thingBefore = thingNow;
}
}
}
// Modifier just counts the shared int up to 1 billion
static class Modifier extends Thread {
public void run() {
int what = 0;
for(int i = 0; i < 1000000000; ++i) {
what += 1;
thing = what;
}
// kill the watcher when done
keepWatching = false;
}
}
public static void main(String[] args) {
Modifier m = new Modifier();
Watcher w = new Watcher();
m.start();
w.start();
}
}
(и это было сделано только с java jre 1.6.0_07 на 32-битном Windows-ПК)
По существу, модификатор записывает последовательность счетчиков в общее целое число, а Watcher проверяет, что наблюдаемые значения никогда не уменьшаются. На машине, где 32-битное значение должно было быть доступно в виде четырех отдельных байтов (или даже двух 16-ти битных слов), была бы вероятность того, что Watcher поймает общее целое в несогласованном, частично обновленном состоянии и обнаружит уменьшение значения а не увеличиваться. Это должно сработать, если (гипотетические) байты данных собираются/записываются LSB 1st или MSB 1st, но в лучшем случае это скорее всего.
Казалось бы, очень вероятно, что сегодня широкие пути данных, что 32-битное значение может быть эффективно атомным, даже если спецификация java не требует этого. Фактически, с 32-битной шиной данных, похоже, вам придется больше работать, чтобы получить атомный доступ к байтам, чем к 32-битным ints.
Googling on "java primitive thread safety" включает в себя множество вещей на потокобезопасных классах и объектах, но поиск информации о примитивах, похоже, ищет иглу пословиц в стоге сена.