comparison src/EDU/oswego/cs/dl/util/concurrent/ReentrantLock.java @ 0:3dc0c5604566

Initial checkin of blitz 2.0 fcs - no installer yet.
author Dan Creswell <dan.creswell@gmail.com>
date Sat, 21 Mar 2009 11:00:06 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:3dc0c5604566
1 /*
2 File: ReentrantLock.java
3
4 Originally written by Doug Lea and released into the public domain.
5 This may be used for any purposes whatsoever without acknowledgment.
6 Thanks for the assistance and support of Sun Microsystems Labs,
7 and everyone contributing, testing, and using this code.
8
9 History:
10 Date Who What
11 11Jun1998 dl Create public version
12 5Aug1998 dl replaced int counters with longs
13 */
14
15 package EDU.oswego.cs.dl.util.concurrent;
16
17 /**
18 * A lock with the same semantics as builtin
19 * Java synchronized locks: Once a thread has a lock, it
20 * can re-obtain it any number of times without blocking.
21 * The lock is made available to other threads when
22 * as many releases as acquires have occurred.
23 * <p>[<a href="http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html"> Introduction to this package. </a>]
24 **/
25
26
27 public class ReentrantLock implements Sync {
28
29 protected Thread owner_ = null;
30 protected long holds_ = 0;
31
32 public void acquire() throws InterruptedException {
33 if (Thread.interrupted()) throw new InterruptedException();
34 Thread caller = Thread.currentThread();
35 synchronized(this) {
36 if (caller == owner_)
37 ++holds_;
38 else {
39 try {
40 while (owner_ != null) wait();
41 owner_ = caller;
42 holds_ = 1;
43 }
44 catch (InterruptedException ex) {
45 notify();
46 throw ex;
47 }
48 }
49 }
50 }
51
52
53 public boolean attempt(long msecs) throws InterruptedException {
54 if (Thread.interrupted()) throw new InterruptedException();
55 Thread caller = Thread.currentThread();
56 synchronized(this) {
57 if (caller == owner_) {
58 ++holds_;
59 return true;
60 }
61 else if (owner_ == null) {
62 owner_ = caller;
63 holds_ = 1;
64 return true;
65 }
66 else if (msecs <= 0)
67 return false;
68 else {
69 long waitTime = msecs;
70 long start = System.currentTimeMillis();
71 try {
72 for (;;) {
73 wait(waitTime);
74 if (caller == owner_) {
75 ++holds_;
76 return true;
77 }
78 else if (owner_ == null) {
79 owner_ = caller;
80 holds_ = 1;
81 return true;
82 }
83 else {
84 waitTime = msecs - (System.currentTimeMillis() - start);
85 if (waitTime <= 0)
86 return false;
87 }
88 }
89 }
90 catch (InterruptedException ex) {
91 notify();
92 throw ex;
93 }
94 }
95 }
96 }
97
98 /**
99 * Release the lock.
100 * @exception Error thrown if not current owner of lock
101 **/
102 public synchronized void release() {
103 if (Thread.currentThread() != owner_)
104 throw new Error("Illegal Lock usage");
105
106 if (--holds_ == 0) {
107 owner_ = null;
108 notify();
109 }
110 }
111
112 /**
113 * Release the lock N times. <code>release(n)</code> is
114 * equivalent in effect to:
115 * <pre>
116 * for (int i = 0; i < n; ++i) release();
117 * </pre>
118 * <p>
119 * @exception Error thrown if not current owner of lock
120 * or has fewer than N holds on the lock
121 **/
122 public synchronized void release(long n) {
123 if (Thread.currentThread() != owner_ || n > holds_)
124 throw new Error("Illegal Lock usage");
125
126 holds_ -= n;
127 if (holds_ == 0) {
128 owner_ = null;
129 notify();
130 }
131 }
132
133
134 /**
135 * Return the number of unreleased acquires performed
136 * by the current thread.
137 * Returns zero if current thread does not hold lock.
138 **/
139 public synchronized long holds() {
140 if (Thread.currentThread() != owner_) return 0;
141 return holds_;
142 }
143
144
145
146 }
147