<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 2  文章 - 2  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    留言簿

    隨筆檔案(1)

    文章分類(16)

    最新隨筆

    搜索

    •  

    最新評論

    ThreadLocal是為了使每個線程保存一份屬于自己的數據。

    先看一個使用ThreadLocal的實例。

    package org.springframework.aop.framework;

    import org.springframework.core.NamedThreadLocal;

    public abstract class AopContext {

        
    private static final ThreadLocal<Object> currentProxy = new NamedThreadLocal<Object>("Current AOP proxy");

        
    public static Object currentProxy() throws IllegalStateException {
            Object proxy 
    = currentProxy.get();
            
    if (proxy == null) {
                
    throw new IllegalStateException(
                        
    "Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.");
            }
            
    return proxy;
        }

        
    static Object setCurrentProxy(Object proxy) {
            Object old 
    = currentProxy.get();
            
    if (proxy != null) {
                currentProxy.set(proxy);
            }
            
    else {
                currentProxy.remove();
            }
            
    return old;
        }

    }

    上例展示的是spring框架中獲取當前線程的代理對象的方法,AopContext.currentProxy(),在本線程的程序調用棧中只要調用AopContext的靜態方法就可以獲取本線程相關的代理對象。如果不用ThreadLocal,那么這個代理對象在創建后,就要一層層傳遞下去,才能在后面獲取到并使用。
    通過這個例子,我們可以知道[b]ThreadLocal主要是提供了一種保持對象的方法以及避免了對象在程序調用中傳遞的簡便訪問方法。ThreadLocal與共享數據和同步沒有明顯關系。[/b]

    下面看看相關的源碼以了解具體的結構。
    public class Thread implements Runnable {
        
    // ThreadLocalMap是一個以ThreadLocal為key,Object為值的map,由ThreadLocal維護
            ThreadLocal.ThreadLocalMap threadLocals = null;
    }

    從Thread的源碼中可以得知,是每一個Thread持有一個自己的map,并不是一個ThreadLocal持有一個map。


    public class ThreadLocal<T> {

     
    public T get() {
        
    // 獲取當前線程
            Thread t = Thread.currentThread();
        
    // 獲取當前線程的threadLocals變量
            ThreadLocalMap map = getMap(t);
        
    // 從當前線程的threadLocals變量中取得本threadLocal為key的值
            if (map != null) {
                ThreadLocalMap.Entry e 
    = map.getEntry(this);
                
    if (e != null)
                    
    return (T)e.value;
            }
            
    return setInitialValue();
        }
        
         
    private T setInitialValue() {
            T value 
    = initialValue();
            Thread t 
    = Thread.currentThread();
            ThreadLocalMap map 
    = getMap(t);
            
    if (map != null)
                map.set(
    this, value);
            
    else
                createMap(t, value);
            
    return value;
        }
        
       
         
    public void set(T value) {
        
    // 獲取當前線程
            Thread t = Thread.currentThread();
        
    // 獲取當前線程的threadLocals變量
            ThreadLocalMap map = getMap(t);
        
    // 以本threadLocal為key的保存值到當前線程的threadLocals變量中去
            if (map != null)
                map.set(
    this, value);
            
    else
                createMap(t, value);
        }
        
         ThreadLocalMap getMap(Thread t) {
            
    return t.threadLocals;
        }
        
         
    void createMap(Thread t, T firstValue) {
            t.threadLocals 
    = new ThreadLocalMap(this, firstValue);
        }
    }

    使用ThreadLocal過程: 對于每一個需要線程保存自身實例的變量,需要定義一個靜態的ThreadLocal實例。然后將一個共用的ThreadLocal靜態實例作為key,將不同對象的引用保存到不同線程的ThreadLocalMap中,然后在線程執行的各處通過這個靜態ThreadLocal實例的get()方法取得自己線程保存的那個對象。
    此外,每個線程保存的自身數據并不是通過備份或復制的,而是new創建出來的。

    通過ThreadLocal各個線程只能獲取自身對應的數據,不能訪問其他線程的數據,但是如果兩個線程在set時引用了同一個數據,仍然存在同步問題。
    posted on 2011-03-31 14:05 liucs 閱讀(2842) 評論(0)  編輯  收藏 所屬分類: 多線程與并發

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 国产在线ts人妖免费视频| 亚洲第一区在线观看| 美女被羞羞网站免费下载| 久久国产亚洲精品麻豆| 日韩在线播放全免费| 四虎成人精品国产永久免费无码| 欧洲亚洲国产清在高| 成人毛片18女人毛片免费96| 一本岛v免费不卡一二三区| 亚洲视频手机在线| 免费人妻av无码专区| 日韩中文字幕免费视频| 国产成人va亚洲电影| 99久久精品国产亚洲| 亚洲国产精品自产在线播放| 黄网站色在线视频免费观看| v片免费在线观看| 2019亚洲午夜无码天堂| 国产亚洲精品资源在线26u| 免费看香港一级毛片| 久久久久久一品道精品免费看| 真人无码作爱免费视频| 亚洲成a人片在线观看精品| 伊人久久大香线蕉亚洲五月天| 最近中文字幕mv免费高清视频7| a级成人毛片免费图片| 色婷婷亚洲一区二区三区| 亚洲精品高清国产麻豆专区| 亚洲中文字幕无码久久精品1| 成人性生交视频免费观看| 91成人在线免费视频| 国产免费黄色无码视频 | 亚洲不卡中文字幕| 亚洲色WWW成人永久网址| 国产午夜无码视频免费网站| 歪歪漫画在线观看官网免费阅读| 久久久久久AV无码免费网站下载| 一级做a爰黑人又硬又粗免费看51社区国产精品视 | 久久亚洲欧美国产精品| 亚洲冬月枫中文字幕在线看| 久久久久亚洲精品影视|