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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java并发编程—ThreadLocal用法详解

發布時間:2024/4/15 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java并发编程—ThreadLocal用法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、用法

ThreadLocal用于保存某個線程共享變量:對于同一個static ThreadLocal,不同線程只能從中get,set,remove自己的變量,而不會影響其他線程的變量。

  • ThreadLocal.get: 獲取ThreadLocal中當前線程共享變量的值。
  • ThreadLocal.set: 設置ThreadLocal中當前線程共享變量的值。
  • ThreadLocal.remove: 移除ThreadLocal中當前線程共享變量的值。
  • ThreadLocal.initialValue: ThreadLocal沒有被當前線程賦值時或當前線程剛調用remove方法后調用get方法,返回此方法值。
  • package?com.coshaho.reflect;public?class?MyThreadLocal{private?static?final?ThreadLocal<Object> threadLocal =?new?ThreadLocal<Object>(){//ThreadLocal沒有被當前線程賦值時或當前線程剛調用remove方法后調用get方法,返回此方法值@Overrideprotected?Object initialValue(){System.out.println("調用get方法時,當前線程共享變量沒有設置,調用initialValue獲取默認值!");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方法獲取線程變量if(null?== MyThreadLocal.threadLocal.get()){// ThreadLocal.et方法設置線程變量MyThreadLocal.threadLocal.set(0);System.out.println("線程"?+ name +?": 0");}else{int?num = (Integer)MyThreadLocal.threadLocal.get();MyThreadLocal.threadLocal.set(num +?1);System.out.println("線程"?+ 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("線程"?+ name +?": a");}else{String str = (String)MyThreadLocal.threadLocal.get();MyThreadLocal.threadLocal.set(str +?"a");System.out.println("線程"?+ name +?": "?+ MyThreadLocal.threadLocal.get());}try{Thread.sleep(800);}catch?(InterruptedException e){e.printStackTrace();}}}} }

    運行結果如下:

    調用get方法時,當前線程共享變量沒有設置,調用initialValue獲取默認值!

    線程IntegerTask1: 0

    調用get方法時,當前線程共享變量沒有設置,調用initialValue獲取默認值!

    線程IntegerTask2: 0

    調用get方法時,當前線程共享變量沒有設置,調用initialValue獲取默認值!

    調用get方法時,當前線程共享變量沒有設置,調用initialValue獲取默認值!

    線程StringTask1: a

    線程StringTask2: a

    線程StringTask1: aa

    線程StringTask2: aa

    線程IntegerTask1: 1

    線程IntegerTask2: 1

    線程StringTask1: aaa

    線程StringTask2: aaa

    線程IntegerTask2: 2

    線程IntegerTask1: 2

    線程StringTask2: aaaa

    線程StringTask1: aaaa

    線程IntegerTask2: 3

    線程IntegerTask1: 3

    線程StringTask1: aaaaa

    線程StringTask2: aaaaa

    調用get方法時,當前線程共享變量沒有設置,調用initialValue獲取默認值!

    線程IntegerTask2: 0

    調用get方法時,當前線程共享變量沒有設置,調用initialValue獲取默認值!

    線程IntegerTask1: 0

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。