Class VarHandle


  • public class VarHandle
    extends java.lang.Object
    A stub for the VarHandle class.
    This stub is used to allow Java 8 release compilation to work as expected. The sole limit of this stub is that since java.lang.invoke is a privileged package it cannot be used at runtime (e.g. loaded by a classloader).

    For example, if SomeClass is loaded at runtime:

         class SomeClass {
              private static final VarHandle VH = // ... obtained somehow;
    
              public static void storeStoreFence() {
                  if (VH == null) {
                      return;
                  }
                  VH.storeStoreFence();
              }
         }
     
    this is not going to work on Java 8.

    To fix it is possible to use an holder class (which won't be loaded at runtime):

         class SomeClass {
              static class Holder {
                  private static final VarHandle VH = // ... obtained somehow;
              }
    
              public static void storeStoreFence() {
                  VarHandle vh = Holder.VH;
                  if (vh == null) {
                      return;
                  }
                  vh.storeStoreFence();
              }
         }
     
    Or:
         class SomeClass {
              private static final Object VH = // ... obtained somehow;
    
              public static void storeStoreFence() {
                  if (VH == null) {
                      return;
                  }
                  ((VarHandle)VH).storeStoreFence();
              }
         }
     
    The reason why the methods on the stub are declared as native is to allow MethodHandle.PolymorphicSignature to work as expected, see JLS 15.12.3:
       A method is signature polymorphic if all of the following are true:
       - It is declared in the java.lang.invoke.MethodHandle class or the java.lang.invoke.VarHandle class.
       - It has a single variable arity parameter (ยง8.4.1) whose declared type is Object[].
       - It is native.
     
    This seems counter-intuitive since this stub is not going to be used at runtime, but it is required to allow Java 8 compilation to produce VarHandle's method invocations with parameters and result types with the types of the formal ones of the compile-time declaration.
    • Constructor Summary

      Constructors 
      Constructor Description
      VarHandle()  
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      boolean compareAndSet​(java.lang.Object... args)  
      java.lang.Object get​(java.lang.Object... args)  
      java.lang.Object getAcquire​(java.lang.Object... args)  
      java.lang.Object getAndAdd​(java.lang.Object... args)  
      void set​(java.lang.Object... args)  
      void setRelease​(java.lang.Object... args)  
      static void storeStoreFence()  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Constructor Detail

      • VarHandle

        public VarHandle()
    • Method Detail

      • get

        public java.lang.Object get​(java.lang.Object... args)
      • getAcquire

        public java.lang.Object getAcquire​(java.lang.Object... args)
      • set

        public void set​(java.lang.Object... args)
      • setRelease

        public void setRelease​(java.lang.Object... args)
      • getAndAdd

        public java.lang.Object getAndAdd​(java.lang.Object... args)
      • compareAndSet

        public boolean compareAndSet​(java.lang.Object... args)
      • storeStoreFence

        public static void storeStoreFence()