SafepointSynchronize::block() checks the _thread_state of the JT and exits with fatal error if the state is not valid. The JT could have the wrong state when checking for safepoint/handshakes but due to timing issues we might not notice it, i.e. there are no current safepoint operations to block for so we never call SafepointSynchronize::block(). A sanity check of the JT state could be added in SafepointMechanism right before checking for pending safepoint operations and calling SafepointSynchronize::block().