-
-
Notifications
You must be signed in to change notification settings - Fork 44
/
SpinLockMutex.java
63 lines (52 loc) · 1.75 KB
/
SpinLockMutex.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
/*
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.unsafe.UnsafeAccess;
import sun.misc.Unsafe;
public final class SpinLockMutex implements Lock {
private static final Unsafe $ = UnsafeAccess.$;
private static final long index = $.objectFieldOffset(SpinLockMutex.class.getFields()[0]);
public volatile int locked = 0;
@Override
public synchronized void lock() {
//noinspection StatementWithEmptyBody
while (!$.compareAndSwapInt(this, index, 0, 1)) {
// Spin lock.
// TODO: Could we instead work on something else here?
}
}
@Override
public synchronized void unlock() {
if (locked == 0) {
throw new IllegalStateException("Unlocked " + this + " before it was locked.");
}
locked = 0;
}
@Override
public synchronized boolean tryLock() {
return $.compareAndSwapInt(this, index, 0, 1);
}
@Override
public synchronized void lockInterruptibly() throws InterruptedException {
throw new UnsupportedOperationException();
}
@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
throw new UnsupportedOperationException();
}
@Override
public Condition newCondition() {
throw new UnsupportedOperationException();
}
}