Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class ALock implements Lock {
- ThreadLocal<Integer> mySlotIndex = new ThreadLocal<Integer> (){
- protected Integer initialValue(){
- return 0;
- }
- };
- AtomicInteger tail;
- PaddedPrimitiveNonVolatile<Boolean>[] flag;
- PaddedPrimitive<Boolean> memFence = new PaddedPrimitive<Boolean>(false);
- int size;
- public ALock(int capacity){
- size = capacity;
- tail = new AtomicInteger(0);
- flag = (PaddedPrimitiveNonVolatile<Boolean>[]) new PaddedPrimitiveNonVolatile[capacity];
- for (int i = 0; i < capacity; i++)
- {
- flag[i] = new PaddedPrimitiveNonVolatile<Boolean>(false);
- }
- flag[0].value = true;
- memFence.value = true;
- }
- public void lock(){
- int slot = tail.getAndIncrement() % size;
- mySlotIndex.set(slot);
- while(! flag[slot].value) {};
- }
- public void unlock(){
- int slot = mySlotIndex.get();
- flag[slot].value = false;
- flag[(slot+1)%size].value = true;
- memFence.value = true;
- }
- @Override
- public boolean tryLock() {
- int slot = tail.get() % size;
- if( flag[slot].value ) { // check first if it the lock is free
- this.lock(); // grab it
- return true;
- }
- else
- return false;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement