12
votes

Aba dans des algorithmes libres de verrouillage

Je comprends la aba problème. Mais la chose que je suis incapable de comprendre est la suivante: ils disent que dans les langues ayant la collecte automatique des ordures , il peut ne pas exposer. Donc, mes questions sont:

  • Comment la collecte automatique des ordures empêche le problème de ABA à se produire?
  • est-il possible en Java et si oui, comment?
  • est-il possible d'empêcher cela de se produire?

0 commentaires

4 Réponses :


9
votes
  • Lorsque la collecte automatique des ordures est activée, aucun autre objet ne peut être attribué avec la même référence et coexister en même temps, c'est que tant qu'il y a un nombre de référence plus important que 0 la référence elle ne sera pas être libéré et réutilisé.

    Vous ne pouvez donc pas "commuter" le contenu de référence sur "Point" pour un objet différent pendant que quelqu'un a toujours l'ancienne référence.


0 commentaires

1
votes

Comment la collecte automatique des ordures empêche le problème de ABA dans se produire? Voir la "programmation de l'art de l'art de multiprocesseur" par Herlihy Shavit. Citation: it (le problème ABA) apparaît souvent, en particulier dans l'algorithme de mémoire dynamique .

Donc, bien sûr, le problème ABA peut apparaître en Java, mais comme dans la plupart des cas, le problème apparaît dans l'algorithme de mémoire dynamique et que vous ne mettez pas de tels algorithmes en Java très souvent, vous ne verrez pas cette erreur dans Java très souvent.

est-il possible en Java et si oui, comment? Le livre "L'art de la programmation multiprocesseur" donne un exemple en Java pour ce problème lié à la récupération de la mémoire pour une file d'attente simultanée sans verrou.

est-il possible d'empêcher cela de se produire? Quote: Évitez ABA en testant que la valeur n'est pas la même à deux points à temps, mais la valeur a jamais changé entre ceux-ci. Points. Une façon de le faire est d'utiliser AtomicstampeReference


3 commentaires

S'il vous plaît donner les écrits du livre ici pour que tout le monde puisse suivre. Et vous pouvez donner cette URL comme référence.


@gstackoverflow, non seulement est "Lire ce livre" poli, c'est une réponse très puissante et généreuse. Cela vous donne les moyens de développer votre propre force. Quelle honte que vous ne pouviez pas apprécier cela et se comporter avec une telle ingratitude. Maintenant, je comprendrais si vous lisez le livre et ce n'était pas bon, mais même alors, il faut que l'Esprit n'offre pas simplement une brève opinion, mais un traitement inappréciable et faisant autorité. Lisez et apprenez et montrez un peu de respect, s'il vous plaît.


@Lew Bloch, si je n'ai pas ce livre, je n'ai pas un autre moyen d'obtenir une réponse? Si la personne comprend le livre correct - il peut expliquer le thème expliqué à ce vook



2
votes

Le problème ABA est orthogonal à la collecte des ordures. Par exemple, les applications peuvent déplacer des objets d'une liste liée à une liste gratuite, puis les réutiliser immédiatement. Par conséquent, l'objet n'est jamais réellement publié avant qu'il ne soit réutilisé. Avec cela, le problème ABA peut se produire de cette manière:

Thread1:
    prevHead = head;

Thread2:
    prevHead = head;
    newHead = getFromFreeList();
    if (cas(&head, prevHead, newHead)) addToFreeList(prevHead);

Thread3:
    prevHead = head;
    newHead = getFromFreeList(); // Get the same object 'released' by Thread2
    cas(&head, prevHead, newHead) // succeeds and put back what was removed by Thread2

Thread1:
    newHead = getFromFreeList();
    if (cas(&head, prevHead, newHead)) addToFreeList(prevHead);
    // CAS will succeed although it shouldn't since there were
    // a modification on the head done by 'Thread3' in between.


0 commentaires

1
votes

Dans le livre "L'art de la programmation multiprocesseur", les auteurs discutent des situations dans lesquelles les programmeurs voudront peut-être mettre en œuvre leur propre pool de ressources (par exemple, un pool de nœuds de liste) en Java. Ensuite, les programmeurs gérant directement la collection de déchets de la piscine contourcent, ce qui améliore la performance. Néanmoins, la prudence doit être prise pour éviter le problème ABA.

Voici le noyau du code Java pour la gestion de la mémoire en Java: xxx

Le code complet de LockFreeQuerecycle.java est disponible ici:

http://booksite.elsevier.com/9780123705914/Exercises/07~chapter_10. Zip

Voir les diapositives et le code du chapitre 10 AT:

http://booksite.elsevier.com/9780123705914/?isbn=9780123705914


0 commentaires