Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.87 KB | None | 0 0
  1. package io.dama.par.hoh;
  2.  
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReadWriteLock;
  5. import java.util.concurrent.locks.ReentrantReadWriteLock;
  6.  
  7.  
  8. public class ThreadsafeSimplifiedList<T> implements SimplifiedList<T> {
  9.  
  10.     private class Node<U> {
  11.         ReadWriteLock lock;
  12.         Lock readLock;
  13.         Lock writeLock;
  14.        
  15.         private U element;
  16.         private Node<U> prev;
  17.         private Node<U> next;
  18.  
  19.         private Node(final U element, final Node<U> prev, final Node<U> next) {
  20.             super();
  21.             lock = new ReentrantReadWriteLock();
  22.             readLock = lock.readLock();
  23.             writeLock = lock.writeLock();
  24.             this.element = element;
  25.             this.prev = prev;
  26.             this.next = next;
  27.         }
  28.     }
  29.    
  30.     private Node<T> first;
  31.  
  32.     @Override
  33.     public T get(int index) {
  34.        
  35.         this.first.readLock.lock();
  36.         Node<T> ptr = this.first;
  37.         for (int j = 0; j < index; j++) {
  38.             ptr.next.readLock.lock();
  39.             ptr = ptr.next;
  40.             ptr.prev.readLock.unlock();
  41.         }
  42.         return delay(ptr.element);
  43.     }
  44.  
  45.     @Override
  46.     public boolean add(T element) {
  47.                
  48.          if(this.first == null) {
  49.             this.first = new Node<>(element, null, null);
  50.          }
  51.          else {
  52.              this.first.readLock.lock();
  53.              Node<T> ptr = this.first;
  54.              this.first.readLock.unlock();
  55.              if(ptr.next != null)
  56.                  ptr.next.readLock.lock();
  57.              while (ptr.next != null) {
  58.                  ptr.next.readLock.lock();
  59.                  ptr = ptr.next;
  60.                  ptr.readLock.unlock();
  61.              }
  62.              if(ptr.next == null) {
  63.                  ptr.next = new Node<>(element, ptr, null);
  64.              }
  65.         }
  66.         return true;
  67.     }
  68.  
  69.     @Override
  70.     public T set(int index, T element) {
  71.            
  72.         if(index == 1) {
  73.             this.first.readLock.lock();
  74.             Node<T> new2nd = this.first;
  75.             this.first.readLock.unlock();
  76.            
  77.             this.first.writeLock.lock();
  78.             this.first = new Node<T>(element, null, new2nd);
  79.             new2nd.prev = this.first;
  80.             new2nd.writeLock.unlock();
  81.         }
  82.         else {
  83.             this.first.readLock.lock();
  84.             Node<T> ptr = this.first;
  85.             for (int j = 1; j < index; j++) {
  86.                 ptr.next.readLock.lock();
  87.                 ptr = ptr.next;
  88.                 ptr.prev.readLock.unlock();
  89.             }
  90.        
  91.             ptr.prev.readLock.lock();
  92.             Node<T> newNode = new Node<>(element, ptr.prev, ptr);
  93.             ptr.readLock.unlock();  
  94.             Node<T> ptrPrev = ptr.prev;
  95.             ptr.prev.readLock.unlock();
  96.            
  97.             ptr.writeLock.lock();
  98.             ptr.prev = newNode;
  99.             ptr.writeLock.unlock();
  100.            
  101.             ptrPrev.writeLock.lock();
  102.             ptrPrev.next = newNode;
  103.             ptrPrev.writeLock.unlock();
  104.         }
  105.        
  106.         return element;
  107.     }
  108.  
  109.     @Override
  110.     public boolean isEmpty() {
  111.         try {
  112.             this.first.readLock.lock();
  113.             return this.first == null;
  114.         } finally {
  115.             this.first.readLock.unlock();
  116.         }
  117.     }
  118.  
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement