[英]Static Hashtable with key-callback reading thread-local variable
问题是我有一个旧的Web服务库,该库具有全局选项的哈希表,并将其与请求选项的哈希表结合在一起。 我无法影响请求代码,但可以设置全局哈希表。 我只是好奇是否有一种简单的方法来实现对Hashtable类的扩展,该扩展将对某些键执行回调以读取某些线程局部变量而不是其原始值?
编辑 :我忘了提到我绑定到JDK 1.4.2。
您可以创建一个从Hashtable
派生的新类,并重写get()
方法。
以twolfe18的代码为基础:
public class MyHashMap<K, V> extends HashMap<K, V> {
TheadLocal special = new TheadLocal ();
public MyHashMap<K, V>() {
super();
}
public V get(K key) {
if ("special".equals (key))
return special.get ();
return super.get(key);
}
}
要设置值,请使用map.special.set(value)
。 每个线程的值将不同。
在对亚伦的回应发表评论时,格式变得很糟糕,所以这里是:
public class MyHashMap<K, V> extends HashMap<K, V> {
public MyHashMap<K, V>() {
super();
}
public V get(K key) {
// check the key or whatever you need to do
V value = super.get(key);
// check the value or whatever you need to do
return value;
}
}
这是我最终使用的代码:
package util;
import java.util.Hashtable;
public class SingleThreadLocalHashtable extends Hashtable {
/** Class version. */
private static final long serialVersionUID = 1L;
private ThreadLocal holder = new ThreadLocal();
private String specialKey;
public SingleThreadLocalHashtable(String specialKey) {
super();
this.holder.set(null);
this.specialKey = specialKey;
}
public synchronized Object get(Object key) {
if ((specialKey != null) && specialKey.equals(key)) {
return holder.get();
}
return super.get(key);
}
public synchronized Object put(Object key, Object value) {
if ((specialKey != null) && specialKey.equals(key)) {
holder.set(value);
}
return super.put(key, value);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.