/*
* Javolution - Java(TM) Solution for Real-Time and Embedded Systems
* Copyright (C) 2005 - Javolution (http://javolution.org/)
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software is
* freely granted, provided that this notice is preserved.
*/
package j2me.lang;
import javolution.util.FastMap;
/**
* Clean-room implementation of ThreadLocal for J2ME Platform support.
*/
public class ThreadLocal {
private static final FastMap THREAD_TO_LOCAL_MAP = new FastMap(256).shared();
public ThreadLocal() {
}
public Object get() {
FastMap localMap = getLocalMap();
Object value = localMap.get(this);
if ((value == null) && !(localMap.containsKey(this))) {
value = initialValue();
localMap.put(this, value);
}
return value;
}
public void set(Object value) {
getLocalMap().put(this, value);
}
public void remove() {
getLocalMap().remove(this);
}
protected Object initialValue() {
return null;
}
private FastMap getLocalMap() {
FastMap localMap = (FastMap) THREAD_TO_LOCAL_MAP.get(Thread
.currentThread());
return (localMap != null) ? localMap : newLocalMap();
}
private FastMap newLocalMap() {
// First, do some cleanup (remove dead threads).
for (FastMap.Entry e = THREAD_TO_LOCAL_MAP.head(), end = THREAD_TO_LOCAL_MAP
.tail(); (e = (FastMap.Entry) e.getNext()) != end;) {
Thread thread = (Thread) e.getKey();
if (!thread.isAlive()) {
THREAD_TO_LOCAL_MAP.remove(thread);
}
}
FastMap localMap = new FastMap();
THREAD_TO_LOCAL_MAP.put(Thread.currentThread(), localMap);
return localMap;
}
}