web-dev-qa-db-fra.com

Quelles opérations dans Java sont considérées comme atomiques?

Quelles opérations dans Java sont considérées comme atomiques?

76
robinmag
  • toutes les affectations de types primitifs à l'exception des longues et doubles
  • toutes les affectations de références
  • toutes les affectations de variables volatiles
  • toutes les opérations des classes Java.concurrent.Atomic *

et peut-être quelque chose de plus. Regardez le jls .

Comme indiqué dans les commentaires, l'atomicité n'implique pas la visibilité. Ainsi, alors qu'un autre thread est garanti de ne pas voir un int partiellement écrit, il peut ne jamais voir la nouvelle valeur.

Les opérations sur long et double se font sur des CPU 64 bits courants atomiques également , bien qu'il n'y ait aucune garantie. Voir aussi ceci demande de fonctionnalité .

93
maaartinus

En Java, la lecture et l'écriture de quantités 32 bits ou inférieures sont garanties atomiques.
Par atomique, nous voulons dire que chaque action se déroule en une seule étape et ne peut pas être interrompue. Ainsi, lorsque nous avons des applications multithread, les opérations de lecture et d'écriture sont thread-safe et n'ont pas besoin d'être synchronisées.

Par exemple, le code suivant est thread-safe:

public class ThreadSafe   
  {  
    private int x;  
    public void setX(int x)  
          {
           this.x = x;
           } 
  }
4
sgokhales

Il semblerait semble que les affectations de longs soient atomiques, basées sur cette méthode dans AtomicLong.Java:

public final void set(long newValue) {
    value = newValue;
}

Notez l'absence de toute synchronisation.

0
Lyle Z