From 90adbd71c7ed24e4a636b3ecc0dbb406e6be82b6 Mon Sep 17 00:00:00 2001 From: Sotr Date: Fri, 10 Aug 2018 22:50:03 +0800 Subject: [PATCH] Cleanup --- .../api/internal/utils/ReentrantSpinningLock.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sources/src/main/java/io/akarin/api/internal/utils/ReentrantSpinningLock.java b/sources/src/main/java/io/akarin/api/internal/utils/ReentrantSpinningLock.java index 01ee2a0a6..dc4561153 100644 --- a/sources/src/main/java/io/akarin/api/internal/utils/ReentrantSpinningLock.java +++ b/sources/src/main/java/io/akarin/api/internal/utils/ReentrantSpinningLock.java @@ -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; } }