@dj Zheng Doujiu Je ne sais pas si cela est correct ou non. Il est conçu sur la base du débogage et ensuite la sortie est t au lieu d'un nœud. Je ne sais pas si tu exprimes aussi ce sens
L'enq simple donne l'impression que cela n'a rien à voir avec la concurrence, c'est juste l'établissement d'une liste doublement chaînée. La liste chaînée en Java n'est pas différente de celle en C++, sauf que Java encapsule le pointeur dans une référence, qui joue toujours le rôle de pointeur. Le Le nœud t peut être considéré de manière abstraite comme le nœud précédent du nœud nouvellement inséré. Il est premier entré, premier sorti dans la file d'attente. Naturellement, le nouveau nœud est inséré à la fin de la file d'attente. donc Noeud t = queue. En ignorant la situation d'une file d'attente vide, si un nœud rejoint une file d'attente, le pré et le suivant du nouveau nœud doivent être traités en premier, donc node.pre = tail; node.next = null;. Pointez ensuite le prochain nœud précédent vers le nouveau nœud, c'est-à-dire le nœud, t.next = node. Ensuite, considérons la file d'attente vide. Ici, la file d'attente est initialisée de force avec un new Node() À ce moment, tail == head. Quant à ne pas insérer le nœud nouvellement inséré, je n'en comprends pas la raison. Intuitivement, compareAndSetHead(node) est plus normal. Bien sûr, il ne modifie pas les valeurs pre et next directement comme une file d'attente à thread unique, mais est encapsulé dans la fonction comapreAndSet* Multi-thread. l’exclusion devrait être maintenue ici.
Ha, vous ne pouvez probablement pas comprendre cette méthode enq maintenant. Si vous ne l'avez pas appris spécifiquement, je suppose que peu de gens peuvent la comprendre. L'apprentissage de la synchronisation sans verrouillage est une partie très avancée du multi-threading.
@dj Zheng Doujiu Je ne sais pas si cela est correct ou non. Il est conçu sur la base du débogage et ensuite la sortie est t au lieu d'un nœud. Je ne sais pas si tu exprimes aussi ce sens
L'enq simple donne l'impression que cela n'a rien à voir avec la concurrence, c'est juste l'établissement d'une liste doublement chaînée. La liste chaînée en Java n'est pas différente de celle en C++, sauf que Java encapsule le pointeur dans une référence, qui joue toujours le rôle de pointeur. Le
Le nœud t peut être considéré de manière abstraite comme le nœud précédent du nœud nouvellement inséré. Il est premier entré, premier sorti dans la file d'attente. Naturellement, le nouveau nœud est inséré à la fin de la file d'attente. donc Noeud t = queue. En ignorant la situation d'une file d'attente vide, si un nœud rejoint une file d'attente, le pré et le suivant du nouveau nœud doivent être traités en premier, donc node.pre = tail; node.next = null;. Pointez ensuite le prochain nœud précédent vers le nouveau nœud, c'est-à-dire le nœud, t.next = node. Ensuite, considérons la file d'attente vide. Ici, la file d'attente est initialisée de force avec un new Node() À ce moment, tail == head. Quant à ne pas insérer le nœud nouvellement inséré, je n'en comprends pas la raison. Intuitivement, compareAndSetHead(node) est plus normal.
Bien sûr, il ne modifie pas les valeurs pre et next directement comme une file d'attente à thread unique, mais est encapsulé dans la fonction comapreAndSet* Multi-thread. l’exclusion devrait être maintenue ici.
Ha, vous ne pouvez probablement pas comprendre cette méthode enq maintenant. Si vous ne l'avez pas appris spécifiquement, je suppose que peu de gens peuvent la comprendre. L'apprentissage de la synchronisation sans verrouillage est une partie très avancée du multi-threading.