最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的ThreadLocal功能演示示例

 更新時間:2021年02月06日 17:10:14   作者:FunTester  
這篇文章主要介紹了Java中的ThreadLocal功能演示示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下

除了使用synchronized同步符號外,Java中的ThreadLocal是另一種實現線程安全的方法。在進行性能測試用例的編寫過程中,比較簡單的辦法就是直接使用synchronized關鍵字,修飾對象、方法以及類。但是使用synchronized同步,這可能會影響應用程序的可伸縮性以及運行效率。但是如果要在多個線程之間共享對象又要保障線程安全,則除了synchronized之外沒有特別適合測試的方法。

Java中的ThreadLocal是實現線程安全的另一種方法,它不滿足同步要求,而是通過為每個線程提供Object的顯式副本來消除共享。由于不再共享對象,因此不需要同步,它可以提高應用程序的可伸縮性和運行效率。

在本文中,會介紹有關ThreadLocal的基礎知識點點,Demo中ThreadLocal的簡單示例。

ThreadLocal簡介

很多人幾乎都沒有用過ThreadLocal類,因為在測試中能用到的地方實在太少了,而且測試腳本的性能一般來講都會很高,遠超被測服務的處理能力,所以即使全部使用synchronized也不會有任何問題。

但是ThreadLocal有很多真正的使用場景,這就是為什么將其添加到標準Java平臺庫中的原因。盡管知道現在多線程編程測試中對于ThreadLocal應用并不多,但是我會在后期多進行一些實踐,分享給各位。

以下是Java中ThreadLocal類的一些眾所周知的用法:

  • ThreadLocal非常適合實現每個線程單例類或每個線程上下文信息(例如事務ID)。
  • 可以將任何非線程對象包裝在ThreadLocal中,并且將其使用變?yōu)榫€程安全的。ThreadLocal的經典示例之一是共享SimpleDateFormat。由于SimpleDateFormat不是線程安全的,因此使用全局格式化程序可能無法正常工作,但是使用每個線程格式化程序當然可以工作。
  • ThreadLocal提供了另一種擴展Thread的方法。如果要保留信息或將信息從一個方法調用傳遞到另一個方法,則可以使用ThreadLocal進行傳遞。
  • 由于不需要修改任何方法,因此可以提供極大的靈活性。

沒有兩個線程可以看到彼此的ThreadLocal變量。J2EE應用程序服務器中有一個ThreadLocal的真實示例,該服務器使用Java ThreadLocal變量來跟蹤事務和安全上下文。

為了避免過多的創(chuàng)建和共享全局實例時的切換成本,將諸如數據庫連接之類的重對象作為ThreadLocal共享是很有意義的。

ThreadLocal演示Demo

package com.fun.ztest.java;

import com.fun.frame.SourceCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;

/**
 * ThreadLocal演示測試類
 */
public class FunTester extends SourceCode {

  public static Logger logger = LoggerFactory.getLogger(FunTester.class);

  /**
   * 這個是重點,通過ThreadLocal類重建線程私有的對象
   */
  private static final ThreadLocal<Object> format = new ThreadLocal() {

    @Override
    protected Object initialValue() {
      Object funTester = new Object();
      logger.info("初始化對象,線程: {} 對象: {}", Thread.currentThread().getName(), funTester.hashCode());
      return funTester;
    }
  };

  public static void main(String args[]) throws IOException, InterruptedException {
    for (int i = 0; i < 5; i++) {
      Thread t = new Thread(new Fun());
      t.start();
    }
  }

  /**
   * 獲取對象
   *
   * @return
   */
  public static Object get() {
    return format.get();
  }


  static class Fun implements Runnable {

    @Override
    public void run() {
      logger.info("線程: {} 對象: {}", Thread.currentThread().getName(), FunTester.get().hashCode());
    }


  }


}


控制臺輸出

INFO-> 當前用戶:fv,IP:10.60.193.37,工作目錄:/Users/fv/Documents/workspace/fun/,系統(tǒng)編碼格式:UTF-8,系統(tǒng)Mac OS X版本:10.16
INFO-> 初始化對象,線程: Thread-1 對象: 347384150
INFO-> 初始化對象,線程: Thread-2 對象: 142607688
INFO-> 線程: Thread-1 對象: 347384150
INFO-> 線程: Thread-2 對象: 142607688
INFO-> 初始化對象,線程: Thread-3 對象: 1008357237
INFO-> 初始化對象,線程: Thread-4 對象: 559951532
INFO-> 線程: Thread-3 對象: 1008357237
INFO-> 線程: Thread-4 對象: 559951532
INFO-> 初始化對象,線程: Thread-5 對象: 748958847
INFO-> 線程: Thread-5 對象: 748958847

Process finished with exit code 0

如果查看上述程序的輸出,則會發(fā)現,當不同的線程調用ThreadLocal類的get()方法而不是調用其initialValue()方法時,該方法將為該線程創(chuàng)建Object的互斥實例對象。 由于Object在線程之間不共享,并且實質上在創(chuàng)建它自己的線程安全對象或者方法的線程本地是完全線程安全的。

ThreadLocal類知識點

  • Java的ThreadLocal在JDK 1.2上引入,但后來在JDK 1.4中進行了泛化,以在ThreadLocal變量上引入類型安全性。
  • ThreadLocal通常與Thread一起使用,由Thread執(zhí)行的所有代碼都可以訪問ThreadLocal變量,但是兩個線程看不到彼此的ThreadLocal變量。
  • 每個線程都擁有ThreadLocal變量的互斥副本,該副本在線程完成或死亡(正常情況下或由于任何異常)后才有進行垃圾回收,因為這些ThreadLocal變量沒有任何其他線程引用。
  • Java中的ThreadLocal變量通常是類中的私有靜態(tài)字段,并在Thread中維護其狀態(tài)。

不要誤解ThreadLocal是Synchronization的替代方法,它全部取決于你自己的程序設計。如果設計允許每個線程擁有自己的對象副本,則可以使用ThreadLocal。

項目中使用

這里一個處理requestid的類,通過ThreadLocal使用,可以保證每個請求都擁有唯一的一個追蹤標記。

public class TraceKeyHolder {
  private static ThreadLocal<String> threadLocal = new ThreadLocal();

  public TraceKeyHolder() {
  }

  public static String getTraceKey() {
    return (String)threadLocal.get();
  }

  public static void setTraceKey(String traceKey) {
    threadLocal.set(traceKey);
  }

  public static void clear() {
    threadLocal.remove();
  }
}

以上就是Java中的ThreadLocal功能演示示例的詳細內容,更多關于Java ThreadLocal功能的資料請關注腳本之家其它相關文章!

相關文章

  • Java web過濾器驗證登錄防止未登錄進入界面

    Java web過濾器驗證登錄防止未登錄進入界面

    這篇文章主要介紹了Java web過濾器驗證登錄防止未登錄進入界面,在一些系統(tǒng)中經??梢杂玫酱斯δ埽瑢ava web 驗證登錄知識感興趣的朋友一起看下吧
    2016-08-08
  • java8 Stream流逐行處理文本文件

    java8 Stream流逐行處理文本文件

    這篇文章主要介紹了java8 Stream流逐行處理文本文件的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • Rabbitmq延遲隊列實現定時任務的方法

    Rabbitmq延遲隊列實現定時任務的方法

    這篇文章主要介紹了Rabbitmq延遲隊列實現定時任務,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Java抽象的本質解析

    Java抽象的本質解析

    對于面向對象編程來說,抽象是它的一大特征之一,在 Java 中可以通過兩種形式來體現OOP的抽象:接口和抽象類,下面這篇文章主要給大家介紹了關于Java基礎抽象的相關資料,需要的朋友可以參考下
    2022-03-03
  • Java虛擬機常見內存溢出錯誤匯總

    Java虛擬機常見內存溢出錯誤匯總

    這篇文章主要匯總了Java虛擬機常見的內存溢出錯誤,警示大家,避免出錯,感興趣的朋友可以了解下
    2020-09-09
  • 阿里通用OCR文字識別/圖像識別/圖片識別對接代碼示例(Java篇)

    阿里通用OCR文字識別/圖像識別/圖片識別對接代碼示例(Java篇)

    這篇文章主要介紹了阿里通用OCR文字識別/圖像識別/圖片識別對接(Java篇)的相關資料,文中詳細介紹了包括開通服務、測試圖片、編寫識別代碼、處理識別結果等步驟,需要的朋友可以參考下
    2024-12-12
  • Spring AOP實現Redis緩存數據庫查詢源碼

    Spring AOP實現Redis緩存數據庫查詢源碼

    這篇文章主要介紹了Spring AOP實現Redis緩存數據庫查詢的相關內容,源碼部分還是不錯的,需要的朋友可以參考下。
    2017-09-09
  • SpringBoot啟動時自動執(zhí)行sql腳本的方法步驟

    SpringBoot啟動時自動執(zhí)行sql腳本的方法步驟

    本文主要介紹了SpringBoot啟動時自動執(zhí)行sql腳本的方法步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Maven依賴作用域和依賴傳遞的使用

    Maven依賴作用域和依賴傳遞的使用

    本文主要介紹了Maven依賴作用域和依賴傳遞的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Spring使用支付寶掃碼支付

    Spring使用支付寶掃碼支付

    這篇文章主要為大家詳細介紹了Spring使用支付寶掃碼支付的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10

最新評論

郎溪县| 望城县| 三穗县| 兰州市| 米脂县| 临海市| 潞城市| 菏泽市| 虹口区| 射阳县| 白水县| 木里| 阿合奇县| 闻喜县| 云梦县| 贵港市| 宜春市| 鄱阳县| 井研县| 南郑县| 奎屯市| 金沙县| 平和县| 津市市| 双江| 大方县| 利辛县| 苏尼特左旗| 山丹县| 左云县| 九江市| 渝中区| 江油市| 奇台县| 峨眉山市| 沂水县| 丹江口市| 克拉玛依市| 辉县市| 榆树市| 五家渠市|