018 ThreadLocal實現執行緒安全

2022-09-14 05:48:07 字數 1017 閱讀 2126

一 .概述

在之前我們討論過執行緒安全性的問題,我們通過加鎖或者使用無鎖來保證執行緒安全.

當然無鎖的效能會變得更好.但是他們的實質的核心都是保證對訪問的資源的原子性.

那我們回憶一下執行緒安全性問題的發生的條件:

[1]多執行緒併發

[2]共享資源

[3]對共享資源的非原子性操作

我們如果將共享資源打破掉,那麼我們是否也能保證執行緒安全呢?

答案是肯定的,threadloacl就能幫助我們實現執行緒級別的區域性變數.

二 .threadlocal的定義

[1] get() : 獲取值

[2]set() : 設定值

[3]remove() : 移除值

現在我們演示一下threadlocal的用法,它定義了執行緒級別的區域性變數.

public

class

threadlocaltest

public

static

void

main(string args)

}).start();

//主線程的執行緒棧中有了local,現在為0

system.out.println("

主線程的local的值為:

" + test.local.get

());

}}

我們建立了乙個含有threadlocal的成員變數的物件,然後修改它的值為0.然後從主線程和子執行緒之中分別列印這個變數,我們發現結果如下:  

主線程的local的值為:0

子執行緒的值為:

null

子執行緒的值為null,說明子執行緒中發生了拷貝.子執行緒和主線程之中的變數並不是共享的.

三 . 解析

我們在前面看見了threadlocal的基本使用,threadlocal可以幫助我們實現執行緒的變數的儲存.

比如在我們的servlet之中,本身模型就是多執行緒模型.

現在我們可以使用threadlocal幫助我們儲存資料.

Threadlocal實現執行緒封閉

threadlocal可以為全域性狀態變數,在當前執行執行緒建立乙個副本,這個副本只允許當前執行緒訪問,其他執行緒無法訪問,實現執行緒封閉。通過介面方法set在當前執行執行緒的副本上設定值,通過get獲取設定的值,第一次呼叫get時候會執行乙個初始化方法initialvalue初始化副本值。pack...

ThreadLocal實現執行緒間變數隔離

之前做android開發時曾看過threadlocal原始碼,但目前又忘記了。寫下篇文章,簡單回顧下吧 首先看下threadlocal的簡單例子 import org.apache.logging.log4j.logmanager import org.apache.logging.log4j.lo...

ThreadLocal是怎麼實現執行緒隔離的

案例 public static void main string args cc1 start new thread new runnable cc2 start 輸出 cc1 2 cc2 null threadlocal的set t t 方法原始碼 public void set t value...