Advertisement
Guest User

Untitled

a guest
Sep 20th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.04 KB | None | 0 0
  1. package msqueue;
  2.  
  3. import java.util.NoSuchElementException;
  4. import java.util.concurrent.atomic.AtomicReference;
  5.  
  6. public class MSQueue implements Queue {
  7. /*private Node head;
  8. private Node tail;
  9. */
  10. private AtomicReference<Node> head;
  11. private AtomicReference<Node> tail;
  12.  
  13. public MSQueue() {
  14. Node dummy = new Node(0, null);
  15. //this.head = dummy;
  16. //this.tail = dummy;
  17. head = new AtomicReference<>(dummy);
  18. tail = new AtomicReference<>(dummy);
  19. }
  20.  
  21. @Override
  22. public void enqueue(int x) {
  23. /*
  24. Node newTail = new Node(x);
  25. tail.next = newTail;
  26. tail = newTail;
  27. */
  28. Node newNode = new Node(x);
  29. newNode.next = new AtomicReference<>(null);
  30. while (true) {
  31. Node currentTail = tail.get();
  32. newNode.next = new AtomicReference<>(currentTail);
  33. if (currentTail.next.get() == null) {
  34. if (tail.get().next.compareAndSet(currentTail.next.get(), newNode)) {
  35. break;
  36. }
  37. } else {
  38. tail.compareAndSet(currentTail, currentTail.next.get());
  39. }
  40. }
  41. }
  42.  
  43. @Override
  44. public int dequeue() {
  45. /*Node curHead = head;
  46. Node next = head.next;
  47. if (curHead == tail)
  48. throw new NoSuchElementException();
  49. head = next;
  50. return next.x;*/
  51. while (true) {
  52. Node currentTail = tail.get();
  53. Node currentHead = head.get();
  54. Node next = currentHead.next.get();
  55. if (currentHead == currentTail) {
  56. if (next == null) {
  57. throw new NoSuchElementException();
  58. }
  59. tail.compareAndSet(currentTail, next);
  60. } else {
  61. int result = next.x;
  62. if (head.compareAndSet(currentHead, next)) {
  63. return result;
  64. }
  65. }
  66. }
  67.  
  68. }
  69.  
  70. @Override
  71. public int peek() {
  72. /*Node curHead = head;
  73. Node next = head.next;
  74. if (curHead == tail)
  75. throw new NoSuchElementException();
  76. return next.x;*/
  77. /*Node currentHead = head.get();
  78. Node current*/
  79. while (true) {
  80. Node currentTail = tail.get();
  81. Node currentHead = head.get();
  82. Node next = currentHead.next.get();
  83. if (currentHead == currentTail) {
  84. if (next == null) {
  85. throw new NoSuchElementException();
  86. }
  87. tail.compareAndSet(currentTail, next);
  88. } else {
  89. //int result = next.x;
  90. return next.x;
  91. }
  92. }
  93. }
  94.  
  95. private class Node {
  96. final int x;
  97. AtomicReference<Node> next;
  98.  
  99. Node(int x) {
  100. this.x = x;
  101. }
  102.  
  103. Node(int x, Node next) {
  104. this.x = x;
  105. this.next = new AtomicReference<>(next);
  106. }
  107. }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement