When run with -XX:+CacheTimeMillis the attached testcase appears to lose time because the cached time is not getting updated after ~4 seconds into the run.
It is caused by the following. The EnableBiasedLocking PeriodicTask runs on the Watcher thread when BiasedLockingStartupDelay > 0. It attempts to synchronously reach a safepoint, blocking the watcher thread, after the delay. If a safepoint cannot be reached relatively quickly, since CacheTimeMillis relies on a responsive watcher thread, the cached time may not get updated promptly.