The successor protocol of the JVM's locking protocol requires the unlocker to check if the successor is racingly set right after storing NULL to the ObjectMonitor owner. Failing to do so will result in nobody waking up the successor, until the next lock operation on the same ObjectMonitor. The result isn’t quite an indefinite hang. The runtime code ensures that at least one ”responsible” thread blocks for a limited amount of time with exponential backoff. So the end result of not honoring the successor protocol can be a long stall, but not an indefinite stall.
We do not perform this check at all in the AArch64 fast_unlock C2 intrinsic. Therefore we are susceptible to these kind of stalls on this platform. Implementing said check will require ldar to be used on succ.