日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java并发编程—ThreadLocal用法详解

發(fā)布時(shí)間:2024/4/15 java 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java并发编程—ThreadLocal用法详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、用法

ThreadLocal用于保存某個(gè)線(xiàn)程共享變量:對(duì)于同一個(gè)static ThreadLocal,不同線(xiàn)程只能從中g(shù)et,set,remove自己的變量,而不會(huì)影響其他線(xiàn)程的變量。

  • ThreadLocal.get: 獲取ThreadLocal中當(dāng)前線(xiàn)程共享變量的值。
  • ThreadLocal.set: 設(shè)置ThreadLocal中當(dāng)前線(xiàn)程共享變量的值。
  • ThreadLocal.remove: 移除ThreadLocal中當(dāng)前線(xiàn)程共享變量的值。
  • ThreadLocal.initialValue: ThreadLocal沒(méi)有被當(dāng)前線(xiàn)程賦值時(shí)或當(dāng)前線(xiàn)程剛調(diào)用remove方法后調(diào)用get方法,返回此方法值。
  • package?com.coshaho.reflect;public?class?MyThreadLocal{private?static?final?ThreadLocal<Object> threadLocal =?new?ThreadLocal<Object>(){//ThreadLocal沒(méi)有被當(dāng)前線(xiàn)程賦值時(shí)或當(dāng)前線(xiàn)程剛調(diào)用remove方法后調(diào)用get方法,返回此方法值@Overrideprotected?Object initialValue(){System.out.println("調(diào)用get方法時(shí),當(dāng)前線(xiàn)程共享變量沒(méi)有設(shè)置,調(diào)用initialValue獲取默認(rèn)值!");return?null;}};public?static?void?main(String[] args){new?Thread(new?MyIntegerTask("IntegerTask1")).start();new?Thread(new?MyStringTask("StringTask1")).start();new?Thread(new?MyIntegerTask("IntegerTask2")).start();new?Thread(new?MyStringTask("StringTask2")).start();}public?static?class?MyIntegerTask?implements?Runnable{private?String name;MyIntegerTask(String name){this.name = name;}@Overridepublic?void?run(){for(int?i =?0; i <?5; i++){// ThreadLocal.get方法獲取線(xiàn)程變量if(null?== MyThreadLocal.threadLocal.get()){// ThreadLocal.et方法設(shè)置線(xiàn)程變量MyThreadLocal.threadLocal.set(0);System.out.println("線(xiàn)程"?+ name +?": 0");}else{int?num = (Integer)MyThreadLocal.threadLocal.get();MyThreadLocal.threadLocal.set(num +?1);System.out.println("線(xiàn)程"?+ name +?": "?+ MyThreadLocal.threadLocal.get());if(i ==?3){MyThreadLocal.threadLocal.remove();}}try{Thread.sleep(1000);}catch?(InterruptedException e){e.printStackTrace();}}??}?}public?static?class?MyStringTask?implements?Runnable{private?String name;MyStringTask(String name){this.name = name;}@Overridepublic?void?run(){for(int?i =?0; i <?5; i++){if(null?== MyThreadLocal.threadLocal.get()){MyThreadLocal.threadLocal.set("a");System.out.println("線(xiàn)程"?+ name +?": a");}else{String str = (String)MyThreadLocal.threadLocal.get();MyThreadLocal.threadLocal.set(str +?"a");System.out.println("線(xiàn)程"?+ name +?": "?+ MyThreadLocal.threadLocal.get());}try{Thread.sleep(800);}catch?(InterruptedException e){e.printStackTrace();}}}} }

    運(yùn)行結(jié)果如下:

    調(diào)用get方法時(shí),當(dāng)前線(xiàn)程共享變量沒(méi)有設(shè)置,調(diào)用initialValue獲取默認(rèn)值!

    線(xiàn)程IntegerTask1: 0

    調(diào)用get方法時(shí),當(dāng)前線(xiàn)程共享變量沒(méi)有設(shè)置,調(diào)用initialValue獲取默認(rèn)值!

    線(xiàn)程IntegerTask2: 0

    調(diào)用get方法時(shí),當(dāng)前線(xiàn)程共享變量沒(méi)有設(shè)置,調(diào)用initialValue獲取默認(rèn)值!

    調(diào)用get方法時(shí),當(dāng)前線(xiàn)程共享變量沒(méi)有設(shè)置,調(diào)用initialValue獲取默認(rèn)值!

    線(xiàn)程StringTask1: a

    線(xiàn)程StringTask2: a

    線(xiàn)程StringTask1: aa

    線(xiàn)程StringTask2: aa

    線(xiàn)程IntegerTask1: 1

    線(xiàn)程IntegerTask2: 1

    線(xiàn)程StringTask1: aaa

    線(xiàn)程StringTask2: aaa

    線(xiàn)程IntegerTask2: 2

    線(xiàn)程IntegerTask1: 2

    線(xiàn)程StringTask2: aaaa

    線(xiàn)程StringTask1: aaaa

    線(xiàn)程IntegerTask2: 3

    線(xiàn)程IntegerTask1: 3

    線(xiàn)程StringTask1: aaaaa

    線(xiàn)程StringTask2: aaaaa

    調(diào)用get方法時(shí),當(dāng)前線(xiàn)程共享變量沒(méi)有設(shè)置,調(diào)用initialValue獲取默認(rèn)值!

    線(xiàn)程IntegerTask2: 0

    調(diào)用get方法時(shí),當(dāng)前線(xiàn)程共享變量沒(méi)有設(shè)置,調(diào)用initialValue獲取默認(rèn)值!

    線(xiàn)程IntegerTask1: 0

    總結(jié)

    以上是生活随笔為你收集整理的Java并发编程—ThreadLocal用法详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。