-
-
Notifications
You must be signed in to change notification settings - Fork 44
/
SimpleMutex.java
84 lines (73 loc) · 1.8 KB
/
SimpleMutex.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*
File: Mutex.java
Originally written by Doug Lea and released into the public domain.
This may be used for any purposes whatsoever without acknowledgment.
Thanks for the assistance and support of Sun Microsystems Labs,
and everyone contributing, testing, and using this code.
History:
Date Who What
11Jun1998 dl Create public version
*/
package me.nallar.tickthreading.util.concurrent;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import me.nallar.tickthreading.Log;
public final class SimpleMutex implements Lock {
protected boolean locked = false;
int waiting = 0;
@Override
public synchronized void lockInterruptibly() throws InterruptedException {
if (!locked) {
locked = true;
return;
}
waiting++;
do {
wait(1L);
} while (locked);
waiting--;
locked = true;
}
@Override
public synchronized void lock() {
if (!locked) {
locked = true;
return;
}
try {
waiting++;
do {
wait(1L);
} while (locked);
waiting--;
locked = true;
} catch (InterruptedException ex) {
// For better performance, we just assume interruption won't happen...
Log.severe("Interrupted while locking", ex);
}
}
@Override
public synchronized void unlock() {
locked = false;
if (waiting != 0) {
notify();
}
}
@Override
public synchronized boolean tryLock() {
if (!locked) {
locked = true;
return true;
}
return false;
}
@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
throw new UnsupportedOperationException();
}
@Override
public Condition newCondition() {
throw new UnsupportedOperationException();
}
}