Je comprends la
4 Réponses :
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é. P>
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. P> li> ul>
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. p>
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
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.
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: p> Le code complet de LockFreeQuerecycle.java est disponible ici: P> http://booksite.elsevier.com/9780123705914/Exercises/07~chapter_10. Zip p> Voir les diapositives et le code du chapitre 10 AT: P> http://booksite.elsevier.com/9780123705914/?isbn=9780123705914 P> p>