/************************************************************************************** * Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. * * http://aspectwerkz.codehaus.org * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the LGPL license * * a copy of which has been included with this distribution in the license.txt file. * **************************************************************************************/ package org.codehaus.aspectwerkz.util; import java.io.Serializable; import java.lang.ref.WeakReference; /** * Extends the <code>java.lang.ThreadLocal</code> to be able to add additional functionality. <p/>This classes * enhances the base implementation by: <p/>making it serializable <p/>making it wrap an unwrap the values in a * <code>java.lang.ref.WeakReference</code> to avoid potential memory leaks * * @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a> */ public class SerializableThreadLocal extends java.lang.ThreadLocal implements Serializable { /** * Constructor. Simply calls the base class constructor. */ public SerializableThreadLocal() { super(); } /** * Overrides the <code>java.lang.ThreadLocal#get()</code> method. Retrieves and returns the value wrapped up in a * <code>java.lang.ref.WeakReference</code> by the <code>SerializableThreadLocal#set(Object value)</code> method * * @return the value wrapped up in a weak reference */ public Object get() { Object ref = super.get(); if (ref == null) { return ref; } else { return ((WeakReference) ref).get(); } } /** * Overrides the <code>java.lang.ThreadLoca#set(Object value)</code> method. Wraps the value in a * <code>java.lang.ref.WeakReference</code> before passing it on to the <code>java.lang.ThreadLocal#set(Object * value)</code> * method * * @param value the value that should be wrapped up in a weak reference */ public void set(final Object value) { synchronized (this) { super.set(new WeakReference(value)); } } }