333 votes

Que signifie "atomique" en programmation ?

Dans le livre Effective Java, il est indiqué :

La spécification du langage garantit que la lecture ou l'écriture d'un est atomique, sauf si la variable est de type long o double [JLS, 17.4.7].

Que signifie le terme "atomique" dans le contexte de la programmation Java, ou de la programmation en général ?

39 votes

Une opération à la fois.

2 votes

Une seule opération peut être effectuée sur la variable à la fois.

0 votes

433voto

JB Nizet Points 250258

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;

0 votes

Sympa - je ne connaissais pas cette affectation atomique volatile longue/double garantie.

91 votes

Cela suppose donc que le système fonctionne sur un système 32 bits. Et si c'était un système 64 bits ? Est-ce que foo = 65465498L ; sera atomique alors ?

58 votes

@Harke Si vous utilisez Java 64 bits, oui.

84voto

H2ONaCl Points 1981

"Opération atomique" signifie une opération qui semble être instantanée du point de vue de tous les autres fils. Il n'est pas nécessaire de s'inquiéter d'une opération partiellement complète lorsque la garantie s'applique.

31voto

Grant Thomas Points 28280

C'est quelque chose qui "semble se produire instantanément pour le reste du système", et qui relève des catégories suivantes Linéarisabilité dans les processus informatiques. Pour citer encore cet article :

L'atomicité est une garantie d'isolation des processus concurrents. De plus, les opérations atomiques ont généralement une définition de type "succès ou échec". soit elles changent avec succès l'état du système, ou n'ont aucun effet apparent.

Ainsi, par exemple, dans le contexte d'un système de base de données, il est possible d'avoir des "commits atomiques", ce qui signifie que vous pouvez envoyer un ensemble de changements de mises à jour à une base de données relationnelle et que ces changements seront soit tous soumis, soit aucun d'entre eux en cas d'échec, de cette façon les données ne sont pas corrompues, et en conséquence des verrous et/ou des files d'attente, l'opération suivante sera une écriture ou une lecture différente, mais seulement après le fait. Dans le contexte des variables et du threading, c'est à peu près la même chose, appliquée à la mémoire.

Votre citation souligne que ce besoin no être un comportement attendu dans tous les cas.

18voto

Kurt Zhong Points 1223

J'ai trouvé un message Opérations atomiques et non atomiques pour être très utile pour moi.

"Une opération agissant sur la mémoire partagée est atomique si elle se termine en une seule étape par rapport aux autres threads.

Lorsqu'un stockage atomique est effectué sur une mémoire partagée, aucun autre thread ne peut observer la modification à moitié terminée.

Lorsqu'une charge atomique est effectuée sur une variable partagée, elle lit la valeur entière telle qu'elle est apparue à un seul moment dans le temps."

15voto

Jacky Points 1063

Dans la philosophie antique, l'atome était l'unité ultime de la matière sur laquelle reposaient des conceptions plus complexes de la réalité matérielle. En programmation informatique, le terme atomique décrit une action ou un objet unitaire qui est essentiellement indivisible, inchangeable, entier et irréductible. Voici quelques usages :

1) En langage de requête structuré, une fonction atomique est une fonction qui s'achèvera ou retournera à son état initial si une interruption de courant ou une fin anormale se produit.

2) Dans certains systèmes d'exploitation basés sur Unix, une opération atomique est une opération dans laquelle aucun changement ne peut avoir lieu dans le temps entre la définition d'un masque et la réception d'un signal pour changer le masque.

3) Dans certains langages de programmation, dont Lisp , un atome est l'unité de base du code ou des données exécutables.

Opération au cours de laquelle un processeur peut simultanément lire un emplacement et l'écrire dans la même opération de bus. Cela empêche tout autre processeur ou périphérique d'E/S d'écrire ou de lire la mémoire jusqu'à ce que l'opération soit terminée.

Atomique implique l'indivisibilité et l'irréductibilité, donc une opération atomique doit être exécutée entièrement ou ne pas être exécutée du tout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X