2010-12-11 8 views
0

Comment le code de démonstration suivant est-il compatible avec les threads? Nous vérifions si la valeur n'est pas modifiée dans l'instruction CAS et si nous faisons un incrément sur int. Ne pas return v + 1; étape battre le but entier car il peut ignorer les mises à jour des discussions.Utilisation de compareAndSet pour la sécurité des threads

Ici, un entier atomique est utilisé pour imiter un compteur int non bloquant.

//Here value is an atomic integer 
public int increment() 
{ 
    int v; 
    for(;;) 
    { 
     v = value.get(); 
     if(value.compareAndSet(v, v + 1)) 
     return v + 1; 
    } 
} 

Si pas le code comme ceci:

public int increment() 
{ 
    int v; 
    for(;;) 
    { 
     v = value.get(); 
     if(value.compareAndSet(v, v + 1)) 
     return value.get(); 
    } 
} 

Répondre

5

compareAndSet() renvoie true si la valeur actuelle est égale à la valeur attendue v et que la valeur a été mise à jour à v + 1.

Dans votre première version, si les deux threads obtenir le même valeur initiale puis on va réussir (la mise à jour v + 1) et l'autre échouera (puisque la valeur actuelle n'est plus v) et une nouvelle tentative en utilisant v + 1 et v + 2.

Si ce code est destiné à renvoyer des clés uniques, la première version est correcte, car au point compareAndSet()true retourné, la valeur actuelle est garantie v + 1 (même si seulement brièvement). La deuxième version peut renvoyer des valeurs dupliquées en raison d'une condition de concurrence si un autre thread modifie la valeur entre vos appels à compareAndSet() et get(). Cela dit, vous pourriez vouloir étudier la méthode de AtomicInteger, qui fait à peu près la même chose mais plus efficacement (pas de boucle explicite).

2

Définir le terme "travail". Disons que value est initialement zéro. Si la première fonction est appelée 100 fois, elle retournera chaque nombre entre 1 et 100 exactement une fois. La deuxième fonction n'a pas cette propriété.

Les deux fonctions peuvent produire des valeurs périmées au retour de la fonction.

Le plus "correct" dépend vraiment de la sémantique attendue de increment.