簡體   English   中英

帶有鍵回調讀取線程局部變量的靜態哈希表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM