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

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

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

    隨筆 - 2  文章 - 2  trackbacks - 0
    <2014年4月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910

    留言簿

    隨筆檔案(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 閱讀(2841) 評論(0)  編輯  收藏 所屬分類: 多線程與并發

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


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 国产福利在线观看永久免费| 亚洲av无一区二区三区| 久久久久久噜噜精品免费直播| 四虎在线播放免费永久视频| 亚洲AV无码一区二区一二区| 精品少妇人妻AV免费久久洗澡| 亚洲一久久久久久久久| 国产成人免费a在线资源| 无码一区二区三区亚洲人妻| 亚洲男人的天堂一区二区| 成人久久久观看免费毛片| 亚洲午夜无码片在线观看影院猛 | 国产aⅴ无码专区亚洲av麻豆| 免费看一级一级人妻片| 久久精品国产精品亚洲| 久久青青草原国产精品免费| 亚洲第一香蕉视频| 最新中文字幕电影免费观看| 亚洲人成色4444在线观看| 国产jizzjizz免费视频| 国产免费福利体检区久久| 久久精品国产亚洲AV麻豆王友容| 在线看片免费人成视久网| 亚洲av产在线精品亚洲第一站 | 美女网站免费福利视频| 在线综合亚洲中文精品| 国产嫩草影院精品免费网址| 一区二区三区在线免费观看视频| 亚洲AV永久无码精品成人| 黄页网站在线观看免费高清| 国产成人亚洲综合在线| 亚洲V无码一区二区三区四区观看| 日韩精品免费一级视频| 亚洲AV无码一区二区三区牲色| 亚洲中文字幕久久精品无码APP | 亚洲人成色7777在线观看不卡| 桃子视频在线观看高清免费视频| 亚洲国产精品免费观看 | 亚洲欧美日韩一区二区三区| 中文字幕亚洲乱码熟女一区二区| 色影音免费色资源|