一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 實例講解Java并發編程之ThreadLocal類

實例講解Java并發編程之ThreadLocal類

2019-12-16 13:18junjie JAVA教程

這篇文章主要介紹了實例講解Java并發編程之ThreadLocal類,本文給出了模擬ThreadLocal、實用ThreadLocal等代碼實例,需要的朋友可以參考下

ThreadLocal類可以理解為ThreadLocalVariable(線程局部變量),提供了get與set等訪問接口或方法,這些方法為每個使用該變量的線程都存有一份獨立的副本,因此get總是返回當前執行線程在調用set時設置的最新值。可以將ThreadLocal<T>視為 包含了Map<Thread,T>對象,保存了特定于該線程的值。

概括起來說,對于多線程資源共享的問題,同步機制采用了“以時間換空間”的方式,而ThreadLocal采用了“以空間換時間”的方式。前者僅提供一份變量,讓不同的線程排隊訪問,而后者為每一個線程都提供了一份變量,因此可以同時訪問而互不影響。

模擬ThreadLocal

復制代碼代碼如下:

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
 
public class SimpleThreadLocal<T> {
 private Map<Thread, T> valueMap = Collections
   .synchronizedMap(new HashMap<Thread, T>());
 
 public void set(T newValue) {
  valueMap.put(Thread.currentThread(), newValue); // ①鍵為線程對象,值為本線程的變量副本
 }
 
 public T get() {
  Thread currentThread = Thread.currentThread();
  T o = valueMap.get(currentThread); // ②返回本線程對應的變量
  if (o == null && !valueMap.containsKey(currentThread)) { // ③如果在Map中不存在,放到Map中保存起來。
   o = initialValue();
   valueMap.put(currentThread, o);
  }
  return o;
 }
 
 public void remove() {
  valueMap.remove(Thread.currentThread());
 }
 
 protected T initialValue() {
  return null;
 }
}


實用ThreadLocal

復制代碼代碼如下:

class Count {
 private SimpleThreadLocal<Integer> count = new SimpleThreadLocal<Integer>() {
  @Override
  protected Integer initialValue() {
   return 0;
  }
 };
 
 public Integer increase() {
  count.set(count.get() + 1);
  return count.get();
 }
 
}
 
class TestThread implements Runnable {
 private Count count;
 
 public TestThread(Count count) {
  this.count = count;
 }
 
 @Override
 public void run() {
  // TODO Auto-generated method stub
  for (int i = 1; i <= 3; i++) {
   System.out.println(Thread.currentThread().getName() + "\t" + i
     + "th\t" + count.increase());
  }
 }
}
 
public class TestThreadLocal {
 public static void main(String[] args) {
  Count count = new Count();
  Thread t1 = new Thread(new TestThread(count));
  Thread t2 = new Thread(new TestThread(count));
  Thread t3 = new Thread(new TestThread(count));
  Thread t4 = new Thread(new TestThread(count));
  t1.start();
  t2.start();
  t3.start();
  t4.start();
 }
}


輸出

復制代碼代碼如下:

Thread-0    1th    1
Thread-0    2th    2
Thread-0    3th    3
Thread-3    1th    1
Thread-1    1th    1
Thread-1    2th    2
Thread-2    1th    1
Thread-1    3th    3
Thread-3    2th    2
Thread-3    3th    3
Thread-2    2th    2
Thread-2    3th    3

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久久影院亚洲精品 | 憋尿调教绝望之岛 | 我的奶头被客人吸的又肿又红 | 国产精品亚洲va在线观看 | 激情综合站 | 精品国产一区二区三区久久久狼 | 精品一久久香蕉国产二月 | 国产欧美日韩图片一区二区 | 秋霞综合网 | 第一次处破女18分钟 | 日日草视频| 欧美日韩一区二区三区在线观看 | 91寡妇天天综合久久影院 | 男人的天堂在线观看免费 | 423hk四虎| 96免费精品视频在线 | 543精品视频 | 久久视频这有精品63在线国产 | 亚洲九九精品 | 国产精品青青在线观看香蕉 | 99色在线播放 | 免费亚洲视频在线观看 | 欧美日韩一区二区三区免费 | 洗濯屋动漫在线观看 | 熟睡迷j系列小说 | 国产精品日韩欧美在线 | 午夜国产福利视频一区 | 九色PORNY真实丨国产大胸 | 韩国一区二区三区 | 日本xxxx69hd | voyeur 中国女厕 亚洲女厕 | 国产成人永久免费视 | 亚洲欧美综合人成野草 | 美女的让男人桶爽免费看 | 日本免费精品 | 亚洲国产自拍在线 | 亚洲福利在线观看 | 日本阿v精品视频在线观看 日本xxx片免费高清在线 | 亚洲瑟瑟网 | 四虎精品永久在线网址 | 久久久久久久久性潮 |