java/lang/InheritableThreadLocal

Started by sukishan, Sep 04, 2009, 04:18 PM

Previous topic - Next topic

sukishan

package java.lang;

import System.LocalDataStoreSlot;

public class InheritableThreadLocal extends ThreadLocal
{
   private static final Object NOT_INIT = new Object();
   private Thread rootThread;
   private Object rootValue;

   public InheritableThreadLocal()
   {
      super();
      rootThread = Thread.currentThread();
      rootValue = NOT_INIT;
   }

   private boolean isRoot()
   {
      return Thread.currentThread().equals(rootThread);
   }

   private Object getRootValue()
   {
      if (rootValue == NOT_INIT)
         rootValue = super.get();
      return rootValue;
   }

   private void setRootValue(Object value)
   {
      this.rootValue = value;
   }

   public synchronized Object get()
   {
      if (!isRoot())
      {
         Object o = System.Threading.Thread.GetData(slot);
         if (o == null)
         {
            o = childValue(getRootValue());
            System.Threading.Thread.SetData(slot, o);
         }
      }
      return super.get();
   }

   public synchronized void set(Object value)
   {
      if (value == null)
         value = NULL;
      System.Threading.Thread.SetData(slot, value);
      if (isRoot())
         setRootValue(value);
   }

   protected Object childValue(Object parentValue)
   {
      return parentValue;
   }
}
A good beginning makes a good ending