KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > daffodilwoods > daffodildb > server > datasystem > persistentsystem > ClusterLock


1 package com.daffodilwoods.daffodildb.server.datasystem.persistentsystem;
2
3 import java.util.HashMap JavaDoc;
4 import java.util.Iterator JavaDoc;
5 import java.util.Set JavaDoc;
6 import java.util.Map JavaDoc;
7
8 /**
9  * <p>Title: </p>
10  * <p>Description: </p>
11  * <p>Copyright: Copyright (c) 2003</p>
12  * <p>Company: </p>
13  * @author not attributable
14  * @version 1.0
15  */

16
17 public class ClusterLock {
18   HashMap JavaDoc map = new HashMap JavaDoc();
19   public ClusterLock() {
20   }
21
22   public void lock(int clusterAddress) {
23
24     Integer JavaDoc integer = new Integer JavaDoc(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 JavaDoc w = new Object JavaDoc();
36
37              synchronized(w){//lockObject.waiters.get(0)){
38
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 JavaDoc ex) {
47               }
48             }
49     }
50   }
51
52   public void unLock(int clusterAddress) {
53     synchronized (map) {
54       LockCounter lc = (LockCounter)map.get(new Integer JavaDoc(clusterAddress));
55         synchronized(lc){
56           lc.decreaseCount();
57           if(lc.waiters.size()>0) {
58             Object JavaDoc 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 JavaDoc(clusterAddress));
66             }
67           }
68           lc.setOwner(null);
69         }
70     }
71   }
72
73   private LockCounter getLockCounter( Integer JavaDoc 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