diff --git a/concurrentutil/src/main/java/ca/spottedleaf/concurrentutil/lock/ReentrantAreaLock.java b/concurrentutil/src/main/java/ca/spottedleaf/concurrentutil/lock/ReentrantAreaLock.java index a523d6f..9c71202 100644 --- a/concurrentutil/src/main/java/ca/spottedleaf/concurrentutil/lock/ReentrantAreaLock.java +++ b/concurrentutil/src/main/java/ca/spottedleaf/concurrentutil/lock/ReentrantAreaLock.java @@ -185,7 +185,7 @@ public Node lock(final int fromX, final int fromY, final int toX, final int toY) final long[] areaAffected = new long[(toSectionX - fromSectionX + 1) * (toSectionY - fromSectionY + 1)]; int areaAffectedLen = 0; - final Node ret = new Node(this, areaAffected, currThread); + Node ret = new Node(this, areaAffected, currThread); for (;;) { Node park = null; @@ -228,8 +228,9 @@ public Node lock(final int fromX, final int fromY, final int toX, final int toY) areaAffectedLen = 0; - // since we inserted, we need to drain waiters - ret.notifier.notifyThreadsAndBlock(); + // A contender may start waiting after this notification, so do not reuse the node. + ret.notifier.notifyThreads(); + ret = new Node(this, areaAffected, currThread); } if (park == null) { @@ -242,6 +243,7 @@ public Node lock(final int fromX, final int fromY, final int toX, final int toY) } // failed + park.notifier.waitUntilReady(); } }