最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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實現(xiàn)簡單點贊功能

    java實現(xiàn)簡單點贊功能

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)簡單點贊功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Java實現(xiàn)滑塊拼圖驗證碼

    Java實現(xiàn)滑塊拼圖驗證碼

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)滑塊拼圖驗證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Spring之動態(tài)注冊bean的實現(xiàn)方法

    Spring之動態(tài)注冊bean的實現(xiàn)方法

    這篇文章主要介紹了Spring之動態(tài)注冊bean的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Java中的HashSet詳解和使用示例_動力節(jié)點Java學(xué)院整理

    Java中的HashSet詳解和使用示例_動力節(jié)點Java學(xué)院整理

    HashSet 是一個沒有重復(fù)元素的集合。接下來通過實例代碼給大家介紹java中的hashset相關(guān)知識,感興趣的朋友一起看看吧
    2017-05-05
  • springboot之聯(lián)表查詢方式

    springboot之聯(lián)表查詢方式

    這篇文章主要介紹了springboot之聯(lián)表查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java基礎(chǔ)教程之構(gòu)造器與方法重載

    Java基礎(chǔ)教程之構(gòu)造器與方法重載

    這篇文章主要介紹了Java基礎(chǔ)教程之構(gòu)造器與方法重載,構(gòu)造器可以初始化數(shù)據(jù)成員,還可以規(guī)定特定的操作,本文還對方法重載做了介紹,需要的朋友可以參考下
    2014-08-08
  • Java中的==和equals()區(qū)別小結(jié)

    Java中的==和equals()區(qū)別小結(jié)

    在Java編程中,理解==操作符和equals()方法的區(qū)別是至關(guān)重要的,本文主要介紹了Java中的==和equals()區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • java遞歸生成樹型結(jié)構(gòu)方式

    java遞歸生成樹型結(jié)構(gòu)方式

    文章介紹了如何使用Java遞歸生成樹形結(jié)構(gòu),包括獲取數(shù)據(jù)、生成樹形結(jié)構(gòu)、查詢子節(jié)點等步驟,作者分享了自己的經(jīng)驗,希望能對大家有所幫助
    2024-12-12
  • Mybatis中@Param的用法和作用詳解

    Mybatis中@Param的用法和作用詳解

    這篇文章主要介紹了Mybatis中@Param的用法和作用,在文中給大家補充了spring中@param和mybatis中@param使用區(qū)別,需要的朋友可以參考下
    2017-09-09
  • Spring實現(xiàn)自定義注解處理器解析和處理注解

    Spring實現(xiàn)自定義注解處理器解析和處理注解

    這篇文章主要介紹了Spring實現(xiàn)自定義注解處理器解析和處理注解,注解在現(xiàn)代Java編程中扮演了至關(guān)重要的角色,無論是簡化代碼、增強可讀性,還是將元數(shù)據(jù)與業(yè)務(wù)邏輯分離,注解都讓我們的代碼更加優(yōu)雅和靈活,需要的朋友可以參考下
    2024-10-10

最新評論

蒙城县| 东乌珠穆沁旗| 包头市| 泸西县| 鹤庆县| 泽普县| 柳江县| 汉寿县| 常州市| 东至县| 易门县| 海伦市| 壤塘县| 黄大仙区| 自贡市| 沭阳县| 荥阳市| 昭苏县| 肇源县| 郯城县| 晋州市| 通州区| 民和| 庄河市| 含山县| 山东| 江门市| 修武县| 榆中县| 阿合奇县| 乌海市| 德格县| 陕西省| 白沙| 闽侯县| 安吉县| 苏尼特左旗| 定结县| 巴南区| 黔西| 侯马市|