1 package com.daffodilwoods.daffodildb.server.datasystem.persistentsystem; 2 3 import java.util.HashMap ; 4 import java.util.Iterator ; 5 import java.util.Set ; 6 import java.util.Map ; 7 8 16 17 public class ClusterLock { 18 HashMap map = new HashMap (); 19 public ClusterLock() { 20 } 21 22 public void lock(int clusterAddress) { 23 24 Integer integer = new Integer (clusterAddress); 25 LockCounter lockObject = getLockCounter(integer); 26 27 while(true){ 28 synchronized (lockObject) { 29 30 if (lockObject.getOwner() == null) { 31 lockObject.setOwner(Thread.currentThread()); 32 return; 33 } 34 } 35 Object w = new Object (); 36 37 synchronized(w){ try { 39 lockObject.waiters.add(w); 40 long startTime = System.currentTimeMillis() ; 41 w.wait(5000); 42 if((System.currentTimeMillis() - startTime) >= 5000 ) 43 lockObject.waiters.remove(w) ; 44 } 45 46 catch (InterruptedException ex) { 47 } 48 } 49 } 50 } 51 52 public void unLock(int clusterAddress) { 53 synchronized (map) { 54 LockCounter lc = (LockCounter)map.get(new Integer (clusterAddress)); 55 synchronized(lc){ 56 lc.decreaseCount(); 57 if(lc.waiters.size()>0) { 58 Object w = lc.waiters.get(0); 59 synchronized(w){ 60 w.notify(); 61 lc.waiters.remove(w); 62 } 63 }else{ 64 if(lc.getCount()==0){ 65 map.remove(new Integer (clusterAddress)); 66 } 67 } 68 lc.setOwner(null); 69 } 70 } 71 } 72 73 private LockCounter getLockCounter( Integer integer){ 74 synchronized(map){ 75 LockCounter lc = (LockCounter)map.get(integer); 76 if(lc==null){ 77 lc = new LockCounter(); 78 map.put(integer, lc); 79 } 80 lc.inreaseCount(); 81 return lc; 82 } 83 } 84 } 85 | Popular Tags |