View Javadoc

    1   /***************************************************************************************
    2    * Copyright (c) Jonas BonŽr, Alexandre Vasseur. All rights reserved.                 *
    3    * http://aspectwerkz.codehaus.org                                                    *
    4    * ---------------------------------------------------------------------------------- *
    5    * The software in this package is published under the terms of the LGPL license      *
    6    * a copy of which has been included with this distribution in the license.txt file.  *
    7    **************************************************************************************/
    8   package org.codehaus.aspectwerkz.util;
    9
    10  import java.io.Serializable;
    11  import java.lang.ref.WeakReference;
    12
    13  /***
    14   * Extends the <code>java.lang.ThreadLocal</code> to be able to add additional functionality. <p/>This classes
    15   * enhances the base implementation by: <p/>making it serializable <p/>making it wrap an unwrap the values in a
    16   * <code>java.lang.ref.WeakReference</code> to avoid potential memory leaks
    17   *
    18   * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr </a>
    19   */
    20  public class SerializableThreadLocal extends java.lang.ThreadLocal implements Serializable {
    21      /***
    22       * Constructor. Simply calls the base class constructor.
    23       */
    24      public SerializableThreadLocal() {
    25          super();
    26      }
    27
    28      /***
    29       * Overrides the <code>java.lang.ThreadLocal#get()</code> method. Retrieves and returns the value wrapped up in a
    30       * <code>java.lang.ref.WeakReference</code> by the <code>SerializableThreadLocal#set(Object value)</code> method
    31       *
    32       * @return the value wrapped up in a weak reference
    33       */
    34      public Object get() {
    35          Object ref = super.get();
    36          if (ref == null) {
    37              return ref;
    38          } else {
    39              return ((WeakReference) ref).get();
    40          }
    41      }
    42
    43      /***
    44       * Overrides the <code>java.lang.ThreadLoca#set(Object value)</code> method. Wraps the value in a
    45       * <code>java.lang.ref.WeakReference</code> before passing it on to the <code>java.lang.ThreadLocal#set(Object
    46       * value)</code>
    47       * method
    48       *
    49       * @param value the value that should be wrapped up in a weak reference
    50       */
    51      public void set(final Object value) {
    52          synchronized (this) {
    53              super.set(new WeakReference(value));
    54          }
    55      }
    56  }