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 }