kolbka_

HandOverHand implementation

Nov 3rd, 2023
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.73 KB | None | 0 0
  1. package linkedlists.lockbased;
  2.  
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReentrantLock;
  5.  
  6. import contention.abstractions.AbstractCompositionalIntSet;
  7.  
  8. public class HandOverHand extends AbstractCompositionalIntSet {
  9.  
  10.   // sentinel nodes
  11.   private Node head;
  12.   private Node tail;
  13.  
  14.   public HandOverHand(){
  15.     head = new Node(Integer.MIN_VALUE);
  16.     tail = new Node(Integer.MAX_VALUE);
  17.     head.next = tail;
  18.   }
  19.  
  20.   private class Nodes{
  21.     public Node curr;
  22.     public Node pred;
  23.     Nodes(Node curr, Node pred){
  24.       this.curr = curr;
  25.       this.pred = pred;
  26.     }
  27.   }
  28.   private Nodes traverse(int item, Node curr, Node pred){
  29.     while(curr.key < item){
  30.       pred.unlock();
  31.       pred = curr;
  32.       curr = pred.next;
  33.       curr.lock();
  34.     }
  35.     return new Nodes(curr, pred);
  36.   }
  37.  
  38.   @Override
  39.   public boolean addInt(int item){
  40.     head.lock();
  41.     Node pred = head;
  42.     Node curr = pred.next;
  43.     try{
  44.       curr.lock();
  45.       try{
  46.         Nodes nn = traverse(item, curr, pred);
  47.         curr = nn.curr; pred = nn.pred;
  48.         if (curr.key == item){
  49.           return false;
  50.         }
  51.         Node node = new Node(item);
  52.         node.next = curr;
  53.         pred.next = node;
  54.         return true;
  55.       }
  56.       finally {
  57.         curr.unlock();
  58.       }
  59.     }
  60.     finally {
  61.       pred.unlock();
  62.     }
  63.   }
  64.  
  65.   @Override
  66.   public boolean removeInt(int item){
  67.     head.lock();
  68.     Node pred = head;
  69.     Node curr = pred.next;
  70.     try{
  71.       curr.lock();
  72.       try{
  73.         Nodes nn = traverse(item, curr, pred);
  74.         curr = nn.curr; pred = nn.pred;
  75.         if (curr.key == item){
  76.           pred.next = curr.next;
  77.           return true;
  78.         }
  79.         return false;
  80.       }
  81.       finally {
  82.         curr.unlock();
  83.       }
  84.     }
  85.     finally {
  86.       pred.unlock();
  87.     }
  88.   }
  89.  
  90.   @Override
  91.   public boolean containsInt(int item){
  92.     Node pred = head;
  93.     Node curr = pred.next;
  94.  
  95.     while(curr.key < item){
  96.       pred = curr;
  97.       curr = pred.next;
  98.     }
  99.     return curr.key == item;
  100.   }
  101.  
  102.   private class Node {
  103.     Node(int item) {
  104.       key = item;
  105.       next = null;
  106.     }
  107.  
  108.     public void lock(){
  109.       l.lock();
  110.     }
  111.     public void unlock(){
  112.       l.unlock();
  113.     }
  114.     public int key;
  115.     public Node next;
  116.     private Lock l = new ReentrantLock();
  117.   }
  118.  
  119.   @Override
  120.   public void clear() {
  121.     head = new Node(Integer.MIN_VALUE);
  122.     head.next = new Node(Integer.MAX_VALUE);
  123.   }
  124.  
  125.   /**
  126.    * Non atomic and thread-unsafe
  127.    */
  128.   @Override
  129.   public int size() {
  130.     int count = 0;
  131.  
  132.     Node curr = head.next;
  133.     while (curr.key != Integer.MAX_VALUE) {
  134.       curr = curr.next;
  135.       count++;
  136.     }
  137.     return count;
  138.   }
  139. }
  140.  
Add Comment
Please, Sign In to add comment