32 |
|
private static class Sync extends AbstractQueuedSynchronizer { |
33 |
|
boolean isLocked() { return getState() == 1; } |
34 |
|
|
35 |
< |
public boolean tryAcquireExclusiveState(boolean isQueued, int acquires) { |
35 |
> |
public boolean tryAcquireExclusive(boolean isQueued, int acquires) { |
36 |
|
assert acquires == 1; // Does not use multiple acquires |
37 |
|
return compareAndSetState(0, 1); |
38 |
|
} |
39 |
|
|
40 |
< |
public boolean releaseExclusiveState(int releases) { |
40 |
> |
public boolean tryReleaseExclusive(int releases) { |
41 |
|
setState(0); |
42 |
|
return true; |
43 |
|
} |
44 |
|
|
45 |
< |
public void checkConditionAccess(Thread thread, boolean waiting) { |
45 |
> |
public void checkConditionAccess(Thread thread) { |
46 |
|
if (getState() == 0) throw new IllegalMonitorStateException(); |
47 |
|
} |
48 |
|
|
52 |
|
s.defaultReadObject(); |
53 |
|
setState(0); // reset to unlocked state |
54 |
|
} |
55 |
+ |
|
56 |
|
} |
57 |
< |
|
57 |
> |
|
58 |
|
private final Sync sync = new Sync(); |
59 |
|
public boolean tryLock() { |
60 |
< |
return sync.tryAcquireExclusiveState(false, 1); |
60 |
> |
return sync.tryAcquireExclusive(false, 1); |
61 |
|
} |
62 |
|
public void lock() { |
63 |
|
sync.acquireExclusiveUninterruptibly(1); |
72 |
|
public Condition newCondition() { return sync.newCondition(); } |
73 |
|
public boolean isLocked() { return sync.isLocked(); } |
74 |
|
public boolean hasQueuedThreads() { return sync.hasQueuedThreads(); } |
75 |
+ |
public boolean hasContended() { return sync.hasContended(); } |
76 |
|
} |
77 |
|
|
78 |
|
/** |
149 |
|
t1.join(); |
150 |
|
t2.join(); |
151 |
|
} catch(Exception e){ |
152 |
+ |
unexpectedException(); |
153 |
+ |
} |
154 |
+ |
} |
155 |
+ |
|
156 |
+ |
|
157 |
+ |
/** |
158 |
+ |
* hasContended reports whether there has been contention |
159 |
+ |
*/ |
160 |
+ |
public void testhasContended() { |
161 |
+ |
final Mutex lock = new Mutex(); |
162 |
+ |
Thread t1 = new Thread(new InterruptedLockRunnable(lock)); |
163 |
+ |
Thread t2 = new Thread(new InterruptibleLockRunnable(lock)); |
164 |
+ |
try { |
165 |
+ |
assertFalse(lock.hasContended()); |
166 |
+ |
lock.lock(); |
167 |
+ |
t1.start(); |
168 |
+ |
Thread.sleep(SHORT_DELAY_MS); |
169 |
+ |
assertTrue(lock.hasContended()); |
170 |
+ |
t2.start(); |
171 |
+ |
Thread.sleep(SHORT_DELAY_MS); |
172 |
+ |
assertTrue(lock.hasContended()); |
173 |
+ |
t1.interrupt(); |
174 |
+ |
Thread.sleep(SHORT_DELAY_MS); |
175 |
+ |
assertTrue(lock.hasContended()); |
176 |
+ |
lock.unlock(); |
177 |
+ |
Thread.sleep(SHORT_DELAY_MS); |
178 |
+ |
assertTrue(lock.hasContended()); |
179 |
+ |
t1.join(); |
180 |
+ |
t2.join(); |
181 |
+ |
} catch(Exception e){ |
182 |
|
unexpectedException(); |
183 |
|
} |
184 |
|
} |