2008-11-29 7 views
5

Je suis nouveau .net et je voudrais savoir si .net a l'équivalent Java de AtomicInteger, ConcurrentLinkedQueue, etc? J'ai fait un peu de recherche et je n'ai pas pu trouver quoi que ce soit.Verrouillez constructions libres dans .net

Les algorithmes sans verrou besoin d'une sorte d'une instruction CAS, qui est fourni par la classe non sécurisée non documentée en Java, .net n'a quoi que ce soit équivalent?

Répondre

2

La classe Interlocked a toutes les méthodes statiques nécessaires pour faire de simples opérations atomiques comme incrément, décrément, comparer, échanger, etc. Consultez http://msdn.microsoft.com/en-us/library/system.threading.interlocked_members.aspx

Pour la plupart des collections, vous pouvez obtenir une collection synchronisée par un membre statique appelé "Synchronisé" Notez cependant que ce ne sont pas des constructions sans verrou, elles cachent simplement le désordre d'utiliser des verrous/sémaphores. Vérifiez la méthode de collecte de file d'attente synchronisée http://msdn.microsoft.com/en-us/library/system.collections.queue.synchronized.aspx

4

J'ai écrit beaucoup de structures de collecte immuables sans système de blocage en .Net. Cela inclut, arbres binaires, des cartes, des tableaux, liste chaînée, etc ... La source et les binaires sont disponibles sur la galerie de code

RantPack

+0

savia. Merci mon pote. –

0

Pour info, il est probable (here) que .NET 4.0 hériteront le CCR/TPL de Parallel Extensions. La TPL, en particulier, introduit une gamme de collections et d'autres constructions conçues pour des scénarios de threading avancés (avec des verrous minimaux, etc.).

Pour l'instant, il y a un nombre limité de collections taraudés etc, ainsi que les primatives de verrouillage habituels, plus Interlocked, etc.

0

Voici le problème que je vois avec classe Interlocked de .net.

J'ai plusieurs threads mettant à jour un compteur. Chaque thread doit avoir une valeur unique du compteur, donc aucun thread ne doit avoir la même valeur.

La façon dont la classe interverrouillage dans les travaux .net, j'ai -

int counter; 
void code(){ 
    myThreadVal = Interlocked.increment(counter); 
} 

maintenant puisque les deux fils peuvent voir la même valeur du compteur, les deux peuvent obtenir la même valeur de myThreadVal.

Cependant, dans le cas de AtomicInteger de java qui ne se produirait jamais, chaque fil serait toujours obtenir une valeur différente.

+0

ahh, donc vous voulez dire le stockage local Thread? –

+0

no. pas thread local, puisque ce compteur est partagé entre plusieurs threads. – pdeva

+3

Non, deux threads ne verront jamais la même valeur de myThreadValue. Interlocked.Increment est atomique. Cependant, vous devez passer le compteur par ref. –

Questions connexes