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 }