欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的ThreadLocal功能演示示例

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

除了使用synchronized同步符號(hào)外,Java中的ThreadLocal是另一種實(shí)現(xiàn)線程安全的方法。在進(jìn)行性能測(cè)試用例的編寫(xiě)過(guò)程中,比較簡(jiǎn)單的辦法就是直接使用synchronized關(guān)鍵字,修飾對(duì)象、方法以及類。但是使用synchronized同步,這可能會(huì)影響應(yīng)用程序的可伸縮性以及運(yùn)行效率。但是如果要在多個(gè)線程之間共享對(duì)象又要保障線程安全,則除了synchronized之外沒(méi)有特別適合測(cè)試的方法。

Java中的ThreadLocal是實(shí)現(xiàn)線程安全的另一種方法,它不滿足同步要求,而是通過(guò)為每個(gè)線程提供Object的顯式副本來(lái)消除共享。由于不再共享對(duì)象,因此不需要同步,它可以提高應(yīng)用程序的可伸縮性和運(yùn)行效率。

在本文中,會(huì)介紹有關(guān)ThreadLocal的基礎(chǔ)知識(shí)點(diǎn)點(diǎn),Demo中ThreadLocal的簡(jiǎn)單示例。

ThreadLocal簡(jiǎn)介

很多人幾乎都沒(méi)有用過(guò)ThreadLocal類,因?yàn)樵跍y(cè)試中能用到的地方實(shí)在太少了,而且測(cè)試腳本的性能一般來(lái)講都會(huì)很高,遠(yuǎn)超被測(cè)服務(wù)的處理能力,所以即使全部使用synchronized也不會(huì)有任何問(wèn)題。

但是ThreadLocal有很多真正的使用場(chǎng)景,這就是為什么將其添加到標(biāo)準(zhǔn)Java平臺(tái)庫(kù)中的原因。盡管知道現(xiàn)在多線程編程測(cè)試中對(duì)于ThreadLocal應(yīng)用并不多,但是我會(huì)在后期多進(jìn)行一些實(shí)踐,分享給各位。

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

  • ThreadLocal非常適合實(shí)現(xiàn)每個(gè)線程單例類或每個(gè)線程上下文信息(例如事務(wù)ID)。
  • 可以將任何非線程對(duì)象包裝在ThreadLocal中,并且將其使用變?yōu)榫€程安全的。ThreadLocal的經(jīng)典示例之一是共享SimpleDateFormat。由于SimpleDateFormat不是線程安全的,因此使用全局格式化程序可能無(wú)法正常工作,但是使用每個(gè)線程格式化程序當(dāng)然可以工作。
  • ThreadLocal提供了另一種擴(kuò)展Thread的方法。如果要保留信息或?qū)⑿畔囊粋€(gè)方法調(diào)用傳遞到另一個(gè)方法,則可以使用ThreadLocal進(jìn)行傳遞。
  • 由于不需要修改任何方法,因此可以提供極大的靈活性。

沒(méi)有兩個(gè)線程可以看到彼此的ThreadLocal變量。J2EE應(yīng)用程序服務(wù)器中有一個(gè)ThreadLocal的真實(shí)示例,該服務(wù)器使用Java ThreadLocal變量來(lái)跟蹤事務(wù)和安全上下文。

為了避免過(guò)多的創(chuàng)建和共享全局實(shí)例時(shí)的切換成本,將諸如數(shù)據(jù)庫(kù)連接之類的重對(duì)象作為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演示測(cè)試類
 */
public class FunTester extends SourceCode {

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

  /**
   * 這個(gè)是重點(diǎn),通過(guò)ThreadLocal類重建線程私有的對(duì)象
   */
  private static final ThreadLocal<Object> format = new ThreadLocal() {

    @Override
    protected Object initialValue() {
      Object funTester = new Object();
      logger.info("初始化對(duì)象,線程: {} 對(duì)象: {}", 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();
    }
  }

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


  static class Fun implements Runnable {

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


  }


}


控制臺(tái)輸出

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

Process finished with exit code 0

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

ThreadLocal類知識(shí)點(diǎn)

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

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

項(xiàng)目中使用

這里一個(gè)處理requestid的類,通過(guò)ThreadLocal使用,可以保證每個(gè)請(qǐng)求都擁有唯一的一個(gè)追蹤標(biāo)記。

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功能演示示例的詳細(xì)內(nèi)容,更多關(guān)于Java ThreadLocal功能的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 方法參數(shù)屬性params,@PathVariable和@RequestParam用法及區(qū)別

    方法參數(shù)屬性params,@PathVariable和@RequestParam用法及區(qū)別

    這篇文章主要介紹了方法參數(shù)屬性params,@PathVariable和@RequestParam用法及區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java當(dāng)中讓事務(wù)回滾的幾種方式

    Java當(dāng)中讓事務(wù)回滾的幾種方式

    這篇文章主要給大家介紹了關(guān)于Java當(dāng)中讓事務(wù)回滾的幾種方式, 事務(wù)回滾通常用于在某些操作失敗時(shí)取消之前已執(zhí)行的所有操作,這樣,我們就可以保證數(shù)據(jù)的一致性,需要的朋友可以參考下
    2023-08-08
  • Java異常學(xué)習(xí)之自定義異常詳解

    Java異常學(xué)習(xí)之自定義異常詳解

    你的程序總有一天會(huì)崩潰掉,在崩潰掉的時(shí)候我們要知道它在哪,為了什么而崩潰掉,數(shù)據(jù)的保存或者丟失情況如何等問(wèn)題。下面這篇文章主要給大家介紹了關(guān)于Java異常學(xué)習(xí)之自定義異常的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-06-06
  • Java簡(jiǎn)單工廠模式定義與用法實(shí)例分析

    Java簡(jiǎn)單工廠模式定義與用法實(shí)例分析

    這篇文章主要介紹了Java簡(jiǎn)單工廠模式定義與用法,結(jié)合實(shí)例形式分析了java簡(jiǎn)單工廠模式的相關(guān)定義與使用技巧,并給出了原理類圖進(jìn)行總結(jié),需要的朋友可以參考下
    2019-07-07
  • eclipse連接數(shù)據(jù)庫(kù)并實(shí)現(xiàn)用戶注冊(cè)登錄功能

    eclipse連接數(shù)據(jù)庫(kù)并實(shí)現(xiàn)用戶注冊(cè)登錄功能

    這篇文章主要介紹了eclipse連接數(shù)據(jù)庫(kù)并實(shí)現(xiàn)用戶注冊(cè)登錄功能的相關(guān)資料,需要的朋友可以參考下
    2021-01-01
  • 基于java類路徑classpath和包的實(shí)例講解

    基于java類路徑classpath和包的實(shí)例講解

    下面小編就為大家分享一篇基于java類路徑classpath和包的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Servlet中文亂碼問(wèn)題解決方案解析

    Servlet中文亂碼問(wèn)題解決方案解析

    這篇文章主要介紹了Servlet中文亂碼問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 如何在mybatis中向BLOB字段批量插入數(shù)據(jù)

    如何在mybatis中向BLOB字段批量插入數(shù)據(jù)

    這篇文章主要介紹了如何在mybatis中向BLOB字段批量插入數(shù)據(jù)的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-10-10
  • slf4j與jul、log4j1、log4j2、logback的集成原理

    slf4j與jul、log4j1、log4j2、logback的集成原理

    這篇文章主要介紹了slf4j與jul、log4j1、log4j2、logback的集成原理,以及通用日志框架與具體日志實(shí)現(xiàn)系統(tǒng)的機(jī)制機(jī)制介紹,包括依賴的jar包,jar沖突處理等
    2022-03-03
  • Java redisson實(shí)現(xiàn)分布式鎖原理詳解

    Java redisson實(shí)現(xiàn)分布式鎖原理詳解

    這篇文章主要介紹了Java redisson實(shí)現(xiàn)分布式鎖原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02

最新評(píng)論