Threadlocal概念複述

1.Threadlocal爲每個線程都創建了一個局部變量副本,線程和線程之間的局部變量相互隔離,

該類提供了線程局部 (thread-local) 變量。這些變量不同於它們的普通對應物,因爲訪問某個變量(通過其 getset 方法)的每個線程都有自己的局部變量,它獨立於變量的初始化副本。ThreadLocal 實例通常是類中的 private static 字段,它們希望將狀態與某一個線程(例如,用戶 ID 或事務 ID)相關聯。


ThreadLocal在保持事務的特性上有獨特的優勢,例如多個線程鏈接數據庫去操作數據庫鏈接的開啓和關閉,線程之間的開啓和關閉有可能會相互干擾,此時可以

將conn放入ThreadLocal<Connection> threadlocal中,從而實現線程之間局部變量的有效隔離;

2.示例1:

 public class UniqueThreadIdGenerator {

     private static final AtomicInteger uniqueId = new AtomicInteger(0);

     private static final ThreadLocal < Integer > uniqueNum = 
         new ThreadLocal < Integer > () {
             @Override protected Integer initialValue() {
                 return uniqueId.getAndIncrement();
         }
     };
 
     public static int getCurrentThreadId() {
         return uniqueId.get();
     }
 } // UniqueThreadIdGenerator

3.示例2:

public class SequenceImpl implements Sequence{
    private static int number=0;

    @Override
    public  int getNumber() {
        numberContainer.set(numberContainer.get()+1);

        return numberContainer.get();
    }



    private static ThreadLocal<Integer> numberContainer=new ThreadLocal<Integer>(){
        @Override
        protected Integer initialValue() {
            return 0;
        }
    };


    public static void main(String[] args) {
        Sequence sequencea = new SequenceImpl();

        ClientThread thread1 = new ClientThread(sequencea);
        ClientThread thread2 = new ClientThread(sequencea);
        ClientThread thread3 = new ClientThread(sequencea);
        thread1.start();
        thread2.start();
        thread3.start();


    }
}
 


4.方法摘要

方法摘要
 T get()
          返回此線程局部變量的當前線程副本中的值。
protected  T initialValue()
          返回此線程局部變量的當前線程的“初始值”。
 void remove()
          移除此線程局部變量當前線程的值。
 void set(T value)
          將此線程局部變量的當前線程副本中的值設置爲指定值。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章