激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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時設置的最新值??梢詫hreadLocal<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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美福利视频一区二区三区 | 石原莉奈日韩一区二区三区 | 国产日韩在线观看一区 | 91高清视频在线观看 | 亚洲精品一区中文字幕 | av在线免费电影 | 黄网站进入 | 精品视频 久久久 | 91久久久久久久久久久久久 | 久在线观看福利视频69 | 7777奇米成人四色影视 | 91视频网国产 | 日韩午夜片 | 久久久久在线观看 | 免费一级欧美大片视频在线 | www.com超碰| 免费特黄| 欧美日韩在线播放 | 国产成人在线播放视频 | 天使萌一区二区三区免费观看 | 国产亚洲精品久久午夜玫瑰园 | 一级做a爱片性色毛片 | 亚洲国产美女视频 | 欧美毛片在线观看 | 成人毛片视频在线播放 | 国产女同玩人妖 | 国产精品亚洲欧美一级在线 | 精品一区二区三区免费毛片爱 | 久久中文免费 | 曰批全过程120分钟免费69 | 一区二区精品视频 | 麻豆一区二区99久久久久 | 免费一及片 | 免费看真人a一级毛片 | 国产无遮挡一区二区三区毛片日本 | 日韩一级免费 | 福利在线播放 | 色交视频 | 激情大乳女做爰办公室韩国 | 自拍亚洲伦理 | 在线91视频 |