這個在Java中的ThreadLocal類別可以保證讓你建立的變數只能被相同的執行緒讀寫。因此,甚至如果兩個執行緒正在執行相同的程式碼,而這個程式碼有一個對於ThreadLocal變數的引用,然後這兩個執行緒就不能看到彼此的ThreadLocal變數。
建立一個ThreadLocal
這裡有一個程式碼現實如何建立一個ThreadLocal:
private ThreadLocal myThreadLocal = new ThreadLocal();
如你看到的,你實例化一個新的ThreadLocal物件。這個每個線程只需要做一次。甚至如果不同的執行緒執行存取一個ThreadLocal的相同的程式碼,每一個執行緒只會看到它自己的ThreadLocal實例。甚至如果兩個執行緒設定不同的值在這相同的ThreadLocal物件上,它們都不會看到彼此的值。
存取一個ThreadLocal
一旦一個ThreadLocal被建立了,你就可以像下面這樣設定一個值去儲存:
myThreadLocal.set("A thread local value");
你可以像下面這樣去讀這個值:
String threadLocalValue = (String) myThreadLocal.get();
這個get方法回傳一個對象,而這個set方法傳遞一個物件作為參數。
泛型化的ThreadLocal
你可以建立一個泛型化的ThreadLocal,以至於你不用在呼叫get方法的時候進行強制轉化了。這裡有一個例子:
private ThreadLocal<String> myThreadLocal = new ThreadLocal<String>();
現在你只能儲存儲存字串類型在ThreadLocal實例中。另外的,你不需要強制轉換這個值了:
myThreadLocal.set("Hello ThreadLocal"); String threadLocalValue = myThreadLocal.get();
初始化ThreadLocal值
因為設定一個ThreadLocal物件的值只是對於設定這個值的執行緒可見的,所以沒有執行緒可以使用set方法設定ThreadLocal的值對所有的執行緒可見。
取代的,你可以透過子類別ThreadLocal特指一個初始化的值對於一個ThreadLocal對象,以及覆寫initialValue方法。像下面這樣:
private ThreadLocal myThreadLocal = new ThreadLocal<String>() { @Override protected String initialValue() { return "This is the initial value"; } };
現在所有的執行緒可以看到相同的初始化值,在呼叫set方法之前。
完整的ThreadLocal實例
這裡有一個完整運行的ThreadLocal實例
public class ThreadLocalExample { public static class MyRunnable implements Runnable { private ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(); @Override public void run() { threadLocal.set( (int) (Math.random() * 100D) ); try { Thread.sleep(2000); } catch (InterruptedException e) { } System.out.println(threadLocal.get()); } } public static void main(String[] args) { MyRunnable sharedRunnableInstance = new MyRunnable(); Thread thread1 = new Thread(sharedRunnableInstance); Thread thread2 = new Thread(sharedRunnableInstance); thread1.start(); thread2.start(); thread1.join(); //wait for thread 1 to terminate thread2.join(); //wait for thread 2 to terminate } }
這個範例創建了一個單獨的MyRunnable實例,它被傳遞給了兩個不同的執行緒。這兩個執行緒都執行了run方法,並且在ThreadLocal實例上設定了不同的值。如果對於這個set方法的呼叫存取是同步的,而且它還沒有使用ThreadLocal對象,第二個執行緒將會覆寫第一個執行緒設定的值。
然而,因為它是一個ThreadLocal對象,不能看到彼此的值。因此,他們設定和得到不同的值。
InheritableThreadLocal
#這個InheritableThreadLocal類別是ThreadLocal類別的子類別。取代的每一個線程在一個ThreadLoca內部都有它自己的值,這個類別同意訪問對於一個線程的值,並且被那個線程創建的所有子線程。
以上就是Java本地線程(ThreadLocal)的內容,更多相關內容請關注PHP中文網(www.php.cn)!

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于设计模式的相关问题,主要将装饰器模式的相关内容,指在不改变现有对象结构的情况下,动态地给该对象增加一些职责的模式,希望对大家有帮助。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

記事本++7.3.1
好用且免費的程式碼編輯器