Java中ThreadLocal分析

jopen 10年前發布 | 16K 次閱讀 Java Java開發

ThreadLocal并不是一個Thread,而是一個線程的局部變量,當使用ThreadLocal維護變量時,ThreadLocal為每個使用該變量的線程提供獨立的變量副本,所以每個線程都可以獨立的改變自己的副本,而不會影響其他線程所對應的副本。

ThreadLocal類的接口很簡單,主要包含以下四個方法,如下:

(1)public void set(T value);

設置當前線程的局部變量值。

2)public T get();

獲得當前線程的局部變量值。

3)public void  remove();

刪除當前線程的局部變量值,目的是減少內存的占用。

4)protected T initValue();

返回該線程的局部變量初始值。

ThreadLocal是如何實現為每個線程提供一個獨立的副本值的呢?其實實現過程很簡單,以下是我自己實現的一個簡單版本:

    package com.test;  

    import java.util.Collections;  
    import java.util.HashMap;  

    public class SimpleThreadLocal<T> {  
        private HashMap map=(HashMap) Collections.synchronizedMap(new HashMap());  

        public void set(T value){  
            Thread thread =Thread.currentThread();  
            map.put(thread, value);  
        }  

        public T get(){  
            Thread thread =Thread.currentThread();  
            Object o=map.get(thread);  
            if(o==null&&map.containsKey(thread)){  
                map.put(thread, initValue());  
            }  
            return (T) o;  
        }  

        public void remove(){  
            map.remove(Thread.currentThread());  
        }  
        protected T initValue(){  
            return null;  
        }  
    }  

ThreadLocal與同步機制的比較

ThreadLocal和線程同步都是為了解決多線程中相同變量的訪問沖突問題

在同步機制中,通過對象的鎖機制保證同一時間只有一個線程訪問變量。這是該變量是多個線程共享的,使用同步機制要求程序分析什么時候對變量進行讀寫,什么時候需要鎖定對象,什么時候釋放對象鎖,這樣增加了程序設計的難度。

而ThreadLocal則從另外一個角度解決多線程的問題。ThreadLocal會為每個線程提供一個獨立的變量副本,這樣就隔離了多線程對數據產生的干擾。

概括起來說,同步機制是以時間換取空間的方式,而ThreadLocal是以空間換取時間的方式。

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!