国产精品久久9a久美女性色,日韩综合中文字幕,天天射天天色天天干,亚洲天堂中文在线,成年人午夜视频,国产精品伦理久久久久久,亚洲欧美视频一区二区

java語(yǔ)言

Java并發(fā)編程:深入剖析ThreadLocal

時(shí)間:2025-03-15 23:04:02 java語(yǔ)言 我要投稿
  • 相關(guān)推薦

Java并發(fā)編程:深入剖析ThreadLocal

  ThreadLocal類(lèi)可以理解為T(mén)hreadLocalVariable(線程局部變量),提供了get與set等訪問(wèn)接口或方法,這些方法為每個(gè)使用該變量的線程都存有一份獨(dú)立的副本,因此get總是返回當(dāng)前執(zhí)行線程在調(diào)用set時(shí)設(shè)置的最新值?梢詫hreadLocal視為 包含了Map對(duì)象,保存了特定于該線程的值。

  概括起來(lái)說(shuō),對(duì)于多線程資源共享的問(wèn)題,同步機(jī)制采用了“以時(shí)間換空間”的方式,而ThreadLocal采用了“以空間換時(shí)間”的方式。前者僅提供一份變量,讓不同的線程排隊(duì)訪問(wèn),而后者為每一個(gè)線程都提供了一份變量,因此可以同時(shí)訪問(wèn)而互不影響。

  模擬ThreadLocal

  復(fù)制代碼 代碼如下:

  import java.util.Collections;

  import java.util.HashMap;

  import java.util.Map;

  public class SimpleThreadLocal{

  private MapvalueMap = Collections

  .synchronizedMap(new HashMap());

  public void set(T newValue) {

  valueMap.put(Thread.currentThread(), newValue); // ①鍵為線程對(duì)象,值為本線程的變量副本

  }

  public T get() {

  Thread currentThread = Thread.currentThread();

  T o = valueMap.get(currentThread); // ②返回本線程對(duì)應(yīng)的變量

  if (o == null && !valueMap.containsKey(currentThread)) { // ③如果在Map中不存在,放到Map中保存起來(lái)。

  o = initialValue();

  valueMap.put(currentThread, o);

  }

  return o;

  }

  public void remove() {

  valueMap.remove(Thread.currentThread());

  }

  protected T initialValue() {

  return null;

  }

  }

  實(shí)用ThreadLocal

  復(fù)制代碼 代碼如下:

  class Count {

  private SimpleThreadLocalcount = new SimpleThreadLocal() {

  @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

  + "tht" + 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();

  }

  }

  輸出

  復(fù)制代碼 代碼如下:

  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

【Java并發(fā)編程:深入剖析ThreadLocal】相關(guān)文章:

java并發(fā)編程參考10-30

簡(jiǎn)單地分析Java線程編程中ThreadLocal類(lèi)的使用08-10

java編程術(shù)語(yǔ)11-10

java編程基礎(chǔ)07-26

Java編程語(yǔ)言10-02

Java中同步與并發(fā)的運(yùn)用07-31

java教程之Java編程基礎(chǔ)09-12

Java編程環(huán)境的搭建06-03

java編程規(guī)范介紹07-10