欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 中ThreadLocal類詳解

 更新時間:2016年03月26日 11:48:51   作者:趙杰A-124  
什么是ThreadLocal?顧名思義它是local variable(線程局部變量)。它的功用非常簡單,就是為每一個使用該變量的線程都提供一個變量值的副本,是每一個線程都可以獨立地改變自己的副本,而不會和其它線程的副本沖突。從線程的角度看,就好像每一個線程都完全擁有該變量。

ThreadLocal類,代表一個線程局部變量,通過把數(shù)據(jù)放在ThreadLocal中,可以讓每個線程創(chuàng)建一個該變量的副本。也可以看成是線程同步的另一種方式吧,通過為每個線程創(chuàng)建一個變量的線程本地副本,從而避免并發(fā)線程同時讀寫同一個變量資源時的沖突。

示例如下:

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import com.sun.javafx.webkit.Accessor;

public class ThreadLocalTest {
 static class ThreadLocalVariableHolder {
  private static ThreadLocal<Integer> value = new ThreadLocal<Integer>() {
   private Random random = new Random();
   
   protected synchronized Integer initialValue() {
    return random.nextInt(10000);
   }
  };
  
  public static void increment() {
   value.set(value.get() + 1);
  }
  
  public static int get() {
   return value.get();
  }
 }
 
 static class Accessor implements Runnable{
  private final int id;
  
  public Accessor(int id) {
   this.id = id;
  }
  
  @Override
  public void run() {
   while (!Thread.currentThread().isInterrupted()) {
    ThreadLocalVariableHolder.increment();
    System.out.println(this);
    Thread.yield();
   }
  }
  
  @Override
  public String toString() {
   return "#" + id + ": " + ThreadLocalVariableHolder.get();
  }
  
 }
 
 public static void main(String[] args) {
  ExecutorService executorService = Executors.newCachedThreadPool();
  for (int i = 0; i < 5; i++) {
   executorService.execute(new Accessor(i));
  }
  try {
   TimeUnit.MICROSECONDS.sleep(1);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  executorService.shutdownNow();
 }

}

運行結(jié)果:

#1: 9685
#1: 9686
#2: 138
#2: 139
#2: 140
#2: 141
#0: 5255
。。。

由運行結(jié)果可知,各線程都用于各自的Local變量,并各自讀寫互不干擾。

ThreadLocal共提供了三個方法來操作,set,get和remove。

在Android 中的Looper,即使用了ThreadLocal來為每個線程都創(chuàng)建各自獨立的Looper對象。

public final class Looper {
 private static final String TAG = "Looper";

 // sThreadLocal.get() will return null unless you've called prepare().
 static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();

 private static void prepare(boolean quitAllowed) {
  if (sThreadLocal.get() != null) {
   throw new RuntimeException("Only one Looper may be created per thread");
  }
  sThreadLocal.set(new Looper(quitAllowed));
 }
 
 。。。
}

當(dāng)某個線程需要自己的Looper及消息隊列時,就調(diào)用Looper.prepare(),它會為線程創(chuàng)建屬于線程的Looper對象及MessageQueue,并將Looper對象保存在ThreadLocal中。

相關(guān)文章

  • Java中Lock鎖基本使用方法詳解

    Java中Lock鎖基本使用方法詳解

    鎖是一種工具,用于控制對共享資源的訪問Lock和synchronized是最常見的兩個鎖,他們都能夠達(dá)到線程安全的目錄,這篇文章主要給大家介紹了關(guān)于Java中Lock鎖基本使用方法詳解的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • SpringBoot Bean被加載時進(jìn)行控制

    SpringBoot Bean被加載時進(jìn)行控制

    很多時候我們需要根據(jù)不同的條件在容器中加載不同的Bean,或者根據(jù)不同的條件來選擇是否在容器中加載某個Bean,這就是Bean的加載控制,一般我們可以通過編程式或注解式兩種不同的方式來完成Bean的加載控制
    2023-02-02
  • java基于GUI實現(xiàn)簡單畫筆小畫板

    java基于GUI實現(xiàn)簡單畫筆小畫板

    這篇文章主要為大家詳細(xì)介紹了java基于GUI實現(xiàn)簡單畫筆小畫板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Springboot 實現(xiàn)跨域訪問無需使用jsonp的實現(xiàn)代碼

    Springboot 實現(xiàn)跨域訪問無需使用jsonp的實現(xiàn)代碼

    這篇文章主要介紹了Springboot 實現(xiàn)跨域訪問 無需使用jsonp的實現(xiàn)代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • Java實現(xiàn)解析dcm醫(yī)學(xué)影像文件并提取文件信息的方法示例

    Java實現(xiàn)解析dcm醫(yī)學(xué)影像文件并提取文件信息的方法示例

    這篇文章主要介紹了Java實現(xiàn)解析dcm醫(yī)學(xué)影像文件并提取文件信息的方法,結(jié)合實例形式分析了java基于第三方庫文件針對dcm醫(yī)學(xué)影像文件的解析操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2018-04-04
  • ZooKeeper開發(fā)實際應(yīng)用案例實戰(zhàn)

    ZooKeeper開發(fā)實際應(yīng)用案例實戰(zhàn)

    這篇文章主要為大家介紹了ZooKeeper開發(fā)的實際應(yīng)用案例實戰(zhàn),文中附含詳細(xì)開發(fā)應(yīng)用源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-01-01
  • SpringMVC響應(yīng)處理詳細(xì)解讀

    SpringMVC響應(yīng)處理詳細(xì)解讀

    Spring?MVC?是?Spring?提供的一個基于?MVC?設(shè)計模式的輕量級?Web?開發(fā)框架,本質(zhì)上相當(dāng)于?Servlet,Spring?MVC?角色劃分清晰,分工明細(xì),本章來講解SpringMVC數(shù)據(jù)響應(yīng)
    2022-07-07
  • jmeter基礎(chǔ)邏輯控制器之if控制器的使用

    jmeter基礎(chǔ)邏輯控制器之if控制器的使用

    在實際工作中,當(dāng)使用JMeter做性能腳本或者接口腳本時,當(dāng)遇到需要對不同的條件做不同的操作時,我們可以使用JMeter中if控制器來實現(xiàn),本文就詳細(xì)的介紹一下如何使用
    2021-11-11
  • Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock詳解

    Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock詳解

    這篇文章主要介紹了Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock詳解,讀寫鎖:一個資源能夠被多個讀線程訪問,或者被一個寫線程訪問但是不能同時存在讀寫線程,需要的朋友可以參考下
    2024-01-01
  • java 靜態(tài)代理 動態(tài)代理深入學(xué)習(xí)

    java 靜態(tài)代理 動態(tài)代理深入學(xué)習(xí)

    代理模式是常用的java設(shè)計模式,特征是代理類與委托類有同樣的接口,代理類主要負(fù)責(zé)為委托類預(yù)處理消息、過濾消息、把消息轉(zhuǎn)發(fā)給委托類,以及事后處理消息等,需要的朋友可以參考下
    2012-11-11

最新評論