国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看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時設置的最新值。可以將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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美视频综合 | a免费在线 | 91久久夜色精品国产网站 | 九色91 | 狠狠爱亚洲 | 黄色片免费在线观看 | 人人射在线视频 | 精品一区二区三区免费 | 久久99深爱久久99精品 | 久久精品小视频 | 久久久久高清视频 | 精品视频在线观看 | 91国自产精品中文字幕亚洲 | 日韩五码 | 亚洲欧美在线观看 | 久久精品国产精品青草 | 亚洲国产视频网站 | 欧美日韩精品电影 | 国产精品视频一二三区 | 人人鲁人人莫一区二区三区 | 日本福利视频 | 久久逼逼| 国产精品第十页 | 91久久久久久 | 欧美激情精品久久久久久黑人 | 国产精品网站在线观看 | av中文在线 | 黄色一级视频 | 毛片网免费 | 日韩欧美在线一区二区 | 亚洲毛片在线观看 | 国产精品久久久 | 91精品麻豆日日躁夜夜躁 | 亚洲欧美v国产一区二区 | 成人区精品一区二区毛片不卡 | 亚洲国产精品一区二区久久 | 亚洲天堂一区二区 | 拍真实国产伦偷精品 | 91精品久久久久久久久久久 | 中文字幕一区二区三区在线观看 | 亚洲一区二区三区久久久 |