This commit is contained in:
Sotr
2018-08-10 22:50:03 +08:00
parent 9f7d36ff50
commit 90adbd71c7

View File

@@ -10,20 +10,21 @@ public class ReentrantSpinningLock {
public void lock() {
long currentThreadId = Thread.currentThread().getId();
if (heldThreadId != 0 && heldThreadId != currentThreadId) {
if (heldThreadId == currentThreadId) {
reentrantLocks.getAndIncrement(); // Reentrant
} else if (heldThreadId != 0) {
while (heldThreadId != 0) ; // The current thread is spinning here
}
tryLock(currentThreadId);
}
private void tryLock(long currentThreadId) {
attemptLock.getAndSet(true); // In case acquire one lock concurrently
if (heldThreadId == currentThreadId) reentrantLocks.getAndIncrement();
heldThreadId = currentThreadId;
attemptLock.set(false);
}
public void unlock() {
if (reentrantLocks.get() > 0) {
if (reentrantLocks.getAndDecrement() == 1) heldThreadId = 0;
} else {
heldThreadId = 0;
}
if (reentrantLocks.get() == 0 || reentrantLocks.getAndDecrement() == 1) heldThreadId = 0;
}
}