鴻蒙OS ThreadLocal

2022-05-26 17:51 更新

ThreadLocal

java.lang.Object

|---java.lang.ThreadLocal<T&

public class ThreadLocal<T>
extends Object

此類提供線程局部變量。 這些變量不同于它們的正常對應(yīng)變量,因為每個訪問一個(通過它的 get 或 set 方法)的線程都有它自己的、獨立初始化的變量副本。 ThreadLocal 實例通常是希望將狀態(tài)與線程相關(guān)聯(lián)的類中的私有靜態(tài)字段(例如,用戶 ID 或事務(wù) ID)。

例如,下面的類生成每個線程本地的唯一標識符。 線程的 id 在第一次調(diào)用 ThreadId.get() 時被分配,并且在后續(xù)調(diào)用中保持不變。

 import java.util.concurrent.atomic.AtomicInteger;


 public class ThreadId {
     // Atomic integer containing the next thread ID to be assigned
     private static final AtomicInteger nextId = new AtomicInteger(0);


     // Thread local variable containing each thread's ID
     private static final ThreadLocal<Integer> threadId =
         new ThreadLocal<Integer>() {
             @Override protected Integer initialValue() {
                 return nextId.getAndIncrement();
         }
     };


     // Returns the current thread's unique ID, assigning it if necessary
     public static int get() {
         return threadId.get();
     }
 }

 

只要線程處于活動狀態(tài)并且 ThreadLocal 實例可訪問,每個線程都持有對其線程局部變量副本的隱式引用; 在線程消失后,它的所有線程本地實例副本都將受到垃圾回收(除非存在對這些副本的其他引用)。

構(gòu)造函數(shù)摘要

構(gòu)造函數(shù) 描述
ThreadLocal() 創(chuàng)建一個線程局部變量。

方法總結(jié)

修飾符和類型 方法 描述
T get() 返回此線程局部變量的當前線程副本中的值。
protected T initialValue() 返回此線程局部變量的當前線程的“初始值”。
void remove() 刪除此線程局部變量的當前線程值。
void set(T value) 將此線程局部變量的當前線程副本設(shè)置為指定值。
static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier) 創(chuàng)建一個線程局部變量。
從類 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

構(gòu)造函數(shù)詳細信息

ThreadLocal

public ThreadLocal()

創(chuàng)建一個線程局部變量。

方法詳情

initialValue

protected T initialValue()

返回此線程局部變量的當前線程的“初始值”。 該方法將在線程第一次使用 get() 方法訪問變量時調(diào)用,除非該線程先前調(diào)用了 set(T) 方法,在這種情況下,不會為該線程調(diào)用 initialValue 方法。 通常,每個線程最多調(diào)用一次此方法,但在隨后調(diào)用 remove() 和 get() 的情況下,它可能會再次調(diào)用。

此實現(xiàn)僅返回 null; 如果程序員希望線程局部變量具有除 null 以外的初始值,則必須將 ThreadLocal 子類化,并重寫此方法。 通常,將使用匿名內(nèi)部類。

返回:

此線程本地的初始值

withInitial

public static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier)

創(chuàng)建一個線程局部變量。 變量的初始值是通過調(diào)用 Supplier 的 get 方法來確定的。

類型參數(shù):

類型參數(shù)名稱 類型參數(shù)描述
S 線程本地值的類型

參數(shù):

參數(shù)名稱 參數(shù)描述
supplier 用于確定初始值的供應(yīng)商

返回:

一個新的線程局部變量

Throws:

Throw名稱 Throw描述
NullPointerException 如果指定的供應(yīng)商為null

get

public T get()

返回此線程局部變量的當前線程副本中的值。 如果變量沒有當前線程的值,則首先將其初始化為調(diào)用 initialValue() 方法返回的值。

返回:

此線程本地的當前線程的值

set

public void set(T value)

將此線程局部變量的當前線程副本設(shè)置為指定值。 大多數(shù)子類不需要重寫此方法,僅依賴于 initialValue() 方法來設(shè)置線程局部變量的值。

參數(shù):

參數(shù)名稱 參數(shù)描述
value 要存儲在此線程本地的當前線程副本中的值。

remove

public void remove()

刪除此線程局部變量的當前線程值。 如果這個線程局部變量隨后被當前線程讀取,它的值將通過調(diào)用它的 initialValue() 方法重新初始化,除非它的值是由當前線程在中間設(shè)置的。 這可能會導(dǎo)致在當前線程中多次調(diào)用 initialValue 方法。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號