title: What are the slow and fast path in GCLocker?
body: <ol>
  <li><p>What are the slow and fast path in GCLocker for JNI critical regions in HotSpot JVM?</p></li>
  <li><p>What's the difference between these two concepts?</p></li>
  </ol>
  
  <p>I find code comment from <code>class GCLocker</code>.</p>
  
  <pre><code>  // JNI critical regions are the only participants in this scheme
    // because they are, by spec, well bounded while in a critical region.
    //
    // Each of the following two method is split into a fast path and a
    // slow path. JNICritical_lock is only grabbed in the slow path.
    // _needs_gc is initially false and every java thread will go
    // through the fast path, which simply increments or decrements the
    // current thread's critical count.  When GC happens at a safepoint,
    // GCLocker::is_active() is checked. Since there is no safepoint in
    // the fast path of lock_critical() and unlock_critical(), there is
    // no race condition between the fast path and GC. After _needs_gc
    // is set at a safepoint, every thread will go through the slow path
    // after the safepoint.  Since after a safepoint, each of the
    // following two methods is either entered from the method entry and
    // falls into the slow path, or is resumed from the safepoints in
    // the method, which only exist in the slow path. So when _needs_gc
    // is set, the slow path is always taken, till _needs_gc is cleared.
    static void lock_critical(JavaThread* thread);
    static void unlock_critical(JavaThread* thread);
  </code></pre>