java多線程之ThreadLocal

一、ThreadLocal概念

ThreadLocal的實例代表了一個線程局部的變量,每條線程都只能看到自己的值,並不會意識到其它的線程中也存在該變量。

 

二、ThreadLocal例子

/**
 * 使用ThreadLocal是爲了使得代碼看起來更加優雅
 * 其實可以通過在每個線程裏面new對象分別計算,
 * 但是因爲這些操作是重複的,而且因爲是各自線程內部變量(new 對象進行計算)
 * 所以線程之間這些重複的操作沒有任何聯繫,
 * 在這兩種情況同時存在的時候就可以使用ThreadLocal讓代碼更加優雅,
 * 但同時也增加了一些閱讀方面的難度。
 */
public class Bank {

    /**用戶餘額*/
    ThreadLocal<Float> balance = ThreadLocal.withInitial(() -> 1000.0f);

    /**添加餘額*/
    public void addBalance(Float addBalance){
        balance.set(balance.get()+addBalance);
    }

    /**獲取餘額*/
    public Float getBalance(){
        return balance.get();
    }

}
/**
 * 使用共享對象Bank
 */
public class Task implements Runnable{

    private Bank bank;

    private Integer count;

    public Task(Bank bank,Integer count) {
        this.bank = bank;
        this.count = count;
    }

    @Override
    public void run() {
        for(int i = 0; i < count; i++){
            bank.addBalance(10f);
        }
        System.out.println("thread: "+Thread.currentThread().getName()+",balance:"+bank.getBalance());
    }
}
public class ThreadLocalTest {

    public static void main(String[] args) {

        //共享變量
        Bank bank = new Bank();

        //兩個任務執行添加餘額操作
        Task task1 = new Task(bank,10);
        Task task2 = new Task(bank,20);
        Thread t1 = new Thread(task1);
        Thread t2 = new Thread(task2);
        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //可以看到主線程、thread-0和thread-1的balance的值都不一樣
        System.out.println("main thread,balance:"+bank.getBalance());

    }

}

三、結果

 

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