Advertisement
Guest User

Untitled

a guest
Mar 30th, 2015
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.17 KB | None | 0 0
  1. class ALock implements Lock {
  2. ThreadLocal<Integer> mySlotIndex = new ThreadLocal<Integer> (){
  3. protected Integer initialValue(){
  4. return 0;
  5. }
  6. };
  7. AtomicInteger tail;
  8. PaddedPrimitiveNonVolatile<Boolean>[] flag;
  9. PaddedPrimitive<Boolean> memFence = new PaddedPrimitive<Boolean>(false);
  10. int size;
  11.  
  12. public ALock(int capacity){
  13. size = capacity;
  14. tail = new AtomicInteger(0);
  15. flag = (PaddedPrimitiveNonVolatile<Boolean>[]) new PaddedPrimitiveNonVolatile[capacity];
  16. for (int i = 0; i < capacity; i++)
  17. {
  18. flag[i] = new PaddedPrimitiveNonVolatile<Boolean>(false);
  19. }
  20. flag[0].value = true;
  21. memFence.value = true;
  22. }
  23. public void lock(){
  24. int slot = tail.getAndIncrement() % size;
  25. mySlotIndex.set(slot);
  26. while(! flag[slot].value) {};
  27. }
  28. public void unlock(){
  29. int slot = mySlotIndex.get();
  30. flag[slot].value = false;
  31. flag[(slot+1)%size].value = true;
  32. memFence.value = true;
  33. }
  34. @Override
  35. public boolean tryLock() {
  36. int slot = tail.get() % size;
  37.  
  38. if( flag[slot].value ) { // check first if it the lock is free
  39. this.lock(); // grab it
  40. return true;
  41. }
  42. else
  43. return false;
  44. }
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement