學習筆記 --- Java 併發程式設計總結二 ThreadLocal
ThreadLocal是什麼
ThreadLocal是一個本地執行緒副本變數工具類。主要用於將私有執行緒和該執行緒存放的副本物件做一個對映,各個執行緒之間的變數互不干擾,在高併發場景下,可以實現無狀態的呼叫,特別適用於各個執行緒依賴不通的變數值完成操作的場景。
下圖為ThreadLocal的內部結構圖
從上面的結構圖,我們已經窺見ThreadLocal的核心機制:
- 每個Thread執行緒內部都有一個Map。
- Map裡面儲存執行緒本地物件(key)和執行緒的變數副本(value)
- 但是,Thread內部的Map是由ThreadLocal維護的,由ThreadLocal負責向map獲取和設定執行緒的變數值。
所以對於不同的執行緒,每次獲取副本值時,別的執行緒並不能獲取到當前執行緒的副本值,形成了副本的隔離,互不干擾。
應用場景:
單例和多執行緒沒有關係,只是單例裡面的變數有多執行緒問題,ThreadLocal
參考:https://www.cnblogs.com/nullzx/p/7553538.html
相關推薦
學習筆記 --- Java 併發程式設計總結二 ThreadLocal
ThreadLocal是什麼 ThreadLocal是一個本地執行緒副本變數工具類。主要用於將私有執行緒和該執行緒存放的副本物件做一個對映,各個執行緒之間的變數互不干擾,在高併發場景下,可以實現無狀態的呼叫,特別適用於各個執行緒依賴不通的變數值完成操作的場景。 下圖為Threa
學習筆記 --- Java 併發程式設計總結一 countDownLatch,CyclicBarrier,Semaphore
在多執行緒程式設計中有三個同步工具需要我們掌握,分別是Semaphore(訊號量),countDownLatch(倒計數門閘鎖),CyclicBarrier(可重用柵欄) CountDownLatch和CyclicBarrier都能夠實現執行緒之間的等待,只不過它們側重點不同:
JAVA學習筆記(併發程式設計 - 玖)- 多執行緒併發拓展
文章目錄 死鎖 概念 產生條件 例子 併發最佳實踐 Spring與執行緒安全 死鎖 概念 死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象
JAVA學習筆記(併發程式設計 - 捌)- 執行緒池
文章目錄 執行緒池 執行緒池的好處 執行緒池原理 執行緒池狀態 執行緒池常用方法 使用ThreadPoolExecutor建立執行緒池 執行緒池 執行緒資源必須通過執行緒池提供,不允許在應用中
JAVA學習筆記(併發程式設計 - 柒)- J.U.C元件2
J.U.C-FutureTask 在Java中一般通過繼承Thread類或者實現Runnable介面這兩種方式來建立執行緒,但是這兩種方式都有個缺陷,就是不能在執行完成後獲取執行的結果,因此Java 1.5之後提供了Callable和Future介面,通過它們就可以在任務執行完畢之後得到
JAVA學習筆記(併發程式設計 - 陸)- J.U.C之AQS及其相關元件詳解
文章目錄 J.U.C之AQS-介紹 關於AQS裡的state狀態: 關於自定義資源共享方式: 關於同步器設計: 如何使用: 具體實現的思路: 設計思想: 基於AQS的同步元件: AQS小結:
JAVA學習筆記(併發程式設計
什麼是釋出物件和物件逸出 ◆釋出物件:使一個物件能夠被當前範圍之外的程式碼所使用 ◆物件逸出:一種錯誤的釋出。當一個物件還沒有構造完成時,就使它被其他執行緒所見 不正確的釋出可變物件導致的兩種錯誤:
Java併發程式設計(二)多執行緒四種實現方式
Java實現多執行緒的方式 Java實現多執行緒的方式有4種: 繼承Thread方法、實現Runnable介面、實現Callable介面並通過FutureTask建立執行緒、使用ExecutorService。 其中,前兩種執行緒執行結果沒有返回值,後兩種是有返回值的。 1、繼承Th
java併發程式設計(二)多個執行緒多個鎖
多個執行緒多個鎖 多個執行緒多個鎖:多個執行緒,每個執行緒都可以拿到自己制定的鎖,分別獲得鎖之後,執行synchronized方法體的內容。就是在上次那個部落格上說道的鎖競爭的問題,是因為所有的執行緒過來以後都爭搶同一個鎖。如果說每個執行緒都可以或得到自己的鎖,這樣的話我們的鎖競爭問題就沒有了
Java併發程式設計(二)——Java併發底層實現原理
Java程式碼會被編譯後變成Java位元組碼,位元組碼會被類載入器載入到JVM中,JVM執行位元組碼,最終轉化成彙編指令在CPU上執行,Java中所使用的併發機制依賴於JVM的實現和CPU的指令。 volatile 在多執行緒併發程式設計中,synchronized和volatile
[讀書筆記][Java併發程式設計實戰]第二章 執行緒安全性
第二章 執行緒安全性 1-什麼是執行緒安全的類? 當多個執行緒訪問某一個類時,不管執行時環境採用何種排程方式或者這些執行緒將如何交替執行,並且在主調程式碼中不需要任何額外的同步或協同,這個
linux學習筆記之shell程式設計(二)條件判斷
條件判斷 檔案存在與否 -d 是否存在為目錄 -e 是否是檔案 -f 是否存在為檔案 [-d /root && echo "yes" || echo "no"] -檔案讀寫執行許可權#### -r 讀許可權 -w 寫
併發程式設計學習:java併發程式設計的藝術(一)
一: 1.併發與並行:併發是多個執行緒(任務)共同爭奪一個cpu進行處理,並行是多個cpu各自處理對應的執行緒任務,現階段都只是併發而不是真正意義上的並行。 2.上下文切換: 即使單行處理器也支援多執行緒執行任務,cpu通過給每個執行緒分配cpu時
Java併發程式設計(二)多執行緒程式設計
在上一節,我們介紹了程序與執行緒的概念,接下來介紹如何使用多執行緒(暫不介紹多程序)。 2. Thread物件 每個執行緒都對應一個Thread例項,存在兩種策略使用Thread類來建立併發程式。 直接進行執行緒的建立和管理,也就是當需要開啟一個非同
Python學習筆記整理併發程式設計
多併發程式設計之程序 0x0程序的概念 0x0什麼是程序? 正在進行的過程或任務,而執行該任務的是CPU。 0x1程序與程式的區別? 程式只是單純的程式碼集,而程式一旦執行則該程式執行的過程則一個程序,在同一個程式執行多次的情況下出現的是多個程序,而不是一個程序,由此得出結論,每執行一次程式就會產生
Java併發程式設計札記-(二)JUC概述
從今天開始學習JUC。JUC是java.util.concurrent包的簡稱。下圖是JUC的整體結構。 atomic 以下是JUC中的原子類。 locks 以下是JUC中的鎖,也稱顯示
Java併發程式設計總結4——ConcurrentHashMap在jdk1.8中的改進
一、簡單回顧ConcurrentHashMap在jdk1.7中的設計 先簡單看下ConcurrentHashMap類在jdk1.7中的設計,其基本結構如圖所示: 每一個segment都是一個HashEntry<K,V>[] table, table中的每一個元素本質上都是一個Has
Java 併發程式設計(二)執行緒狀態躍遷
執行緒的狀態: 1、新建狀態(New) 新建立了一個執行緒物件。 示例: Thread t = new Thread(); 2、就緒狀態(Runnable) 執行緒物件建立後,
Java併發程式設計(二) CountDownLatch
接上一回,如果4個工人在裝配車輪時,工作間中沒有車輪可裝配,工人必須等到車輪運送到工作間合適的位置後才可以進行裝配車輪的工作。所以,在Worker類中加入一把新的CountDownLatch-----tyreReadyLatch, 讓這把鎖告訴Worker執行緒,在輪胎到來之
Java併發程式設計系列(二)-synchronized同步鎖
synchronized基本用法 從一個簡單的例子入手 1 public class C1 { 2 private int count = 10; 3 4 public void foo() { 5 count--; 6 System.out.p