Voici un exemple : Supposons que foo
est une variable de type long
alors l'opération suivante n'est pas une opération atomique ( en Java ) :
foo = 65465498L;
En effet, la variable est écrite en utilisant deux opérations distinctes : une qui écrit les 32 premiers bits, et une seconde qui écrit les 32 derniers bits. Cela signifie qu'un autre thread peut lire la valeur de la variable foo
et voir l'état intermédiaire.
Rendre l'opération atomique consiste à utiliser des mécanismes de synchronisation afin de s'assurer que l'opération est vue, depuis n'importe quel autre thread, comme une opération unique, atomique (c'est-à-dire non divisible en parties). Cela signifie que tout autre thread, une fois l'opération rendue atomique, verra soit la valeur de foo
avant l'affectation, ou après l'affectation. Mais jamais la valeur intermédiaire.
Une façon simple de procéder est de faire en sorte que la fonction variable volatile :
private volatile long foo;
Ou pour synchroniser chaque accès à la variable :
public synchronized void setFoo(long value) {
this.foo = value;
}
public synchronized long getFoo() {
return this.foo;
}
// no other use of foo outside of these two methods, unless also synchronized
Ou pour le remplacer par un AtomicLong
:
private AtomicLong foo;
39 votes
Une opération à la fois.
2 votes
Une seule opération peut être effectuée sur la variable à la fois.
0 votes
ibm.com/developerworks/library/j-jtp11234
1 votes
Je pense que les questions de philosophie doivent être placées dans codereview.stackexchange.com
0 votes
Notant que certaines variables n'ont pas par défaut la lecture et l'écriture atomique, les déclarant en tant que
volatile long
ovolatile double
rend la lecture atomique et l'écriture atomique.0 votes
Atomique vient du grec, qui signifie "indivisible". fr.wikipedia.org/wiki/Atomicité_(systèmes_de_bases_de_données) (Les bases de données utilisent l'"atomicité" pour des transactions entières de la même manière que la programmation sans verrouillage l'utilise pour des opérations uniques. (Ou pour les transactions en mémoire transactionnelle))