Sont java primitive des entiers (int) atomique à tous, pour que la matière? Quelques essais avec les deux fils du partage d'un int, ce qui semble indiquer qu'ils sont, mais bien sûr l'absence de preuve qu'ils sont pas ne signifie pas qu'ils sont.
Plus précisément, le test que j'ai couru c'était ça:
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();
}
}
(et c'était seulement essayé avec java jre 1.6.0_07 sur un windows 32 bits PC)
Essentiellement, le Modificateur écrit un nombre de la séquence de la salle de entier, tandis que l'Observateur vérifie que les valeurs observées ne jamais diminuer. Sur une machine où une valeur 32 bits devait être consulté en tant que de quatre octets (ou même deux mots de 16 bits), il y aurait une probabilité que l'Observateur attrape le partagé entier dans un incohérent, demi-état mis à jour, et de détecter la valeur de déclin plutôt que de l'augmenter. Cela devrait fonctionner si le (hypothétique) octets de données sont collectées/écrit LSB 1er ou le MSB 1er, mais est seulement probabiliste au mieux.
Il semble très probable, étant donné aujourd'hui à l'échelle chemins de données une valeur 32 bits peut être atomique, même si le java spec ne l'exige pas. En fait, avec la version 32 bits du bus de données, il semblerait que vous pourriez avoir à travailler plus fort pour obtenir de l'accès atomique d' octets que de 32 bits entiers.
Googling "primitif java thread de sécurité" se transforme des charges des trucs sur le thread-safe de classes et d'objets, mais la recherche de l'info sur les primitives semble être à la recherche de la proverbiale aiguille dans une botte de foin.