首頁 > Java > java教程 > Java 執行緒局部

Java 執行緒局部

WBOY
發布: 2024-08-30 16:03:25
原創
610 人瀏覽過

同一個執行緒可以讀寫的變數可以使用Java中的ThreadLocal類別來創建,因此如果兩個執行緒執行相同的程式碼並且該程式碼引用了相同的變數ThreadLocal,兩個執行緒看不到ThreadLocal的這些變數,因此可以透過使用ThreadLocal類別使程式碼成為執行緒安全的,而如果不使用ThreadLocal類別和ThreadLocal類別的實例,程式碼就不是執行緒安全的可以像使用new 運算子建立java 中任何其他類別的實例一樣建立。

開始您的免費軟體開發課程

網頁開發、程式語言、軟體測試及其他

ThreadLocal 類別在 Java 中如何運作?

線程局部變數是由Java中的java.lang.ThreadLocal類別提供的。這些變數與普通變數不同,因此每個獨立的、擁有的、擁有該變數副本並已初始化的執行緒都可以使用 get 或 set 方法來存取它們。這基本上是除了編寫不可變類別之外實現線程安全的其他方法之一。

不再共享對象,因此不需要同步,從而提高應用程式的效能和可擴展性。 Java中的ThreadLocal類別擴展了類別物件。局部變數的擴展,是對線程的一種限制,是由Java中的ThreadLocal類別提供的。只有單一執行緒可以查看ThreadLocal。彼此的線程無法看到兩個線程的ThreadLocal變數。 ThreadLocal變數屬於私有字段,在類別中是靜態的,狀態在線程內部維護。

Java中ThreadLocal的創建

ThreadLocal 實例的建立方式與使用 new 運算子建立任何其他 java 物件實例的方式類似。考慮以下語法在 Java 中建立 ThreadLocal:

private ThreadLocal variable_name = new ThreadLocal();
登入後複製

ThreadLocal 的建立對於一個執行緒只能建立一次。這個ThreadLocal內部的多個線程可以設定然後取得這些值,並且只有線程設定的值才能被自己看到。

在Java中取得ThreadLocal值

可以使用 ThreadLocal 的 get() 方法來讀取儲存在 ThreadLocal 中的值。考慮以下語法來取得 Java 中的 ThreadLocal 值:

String variable_name = (String) threadLocal.get();
登入後複製

在 Java 中設定 ThreadLocal 值

ThreadLocal 建立後要儲存在其中的值可以使用 set() 方法設定。考慮以下語法在 Java 中設定 ThreadLocal 值:

threadLocal.set("value_that_needs_to_be_set");
登入後複製

移除 Java 中的 ThreadLocal 值。

ThreadLocal 建立後設定的值可以刪除。可以使用 ThreadLocalremove() 方法移除 ThreadLocal 值。請考慮以下語法來刪除在 Java 中設定的 ThreadLocal 值:

threadLocal.remove();
登入後複製

實作 Java ThreadLocal 的範例

以下是提到的範例:

範例#1

ThreadLocal類別的get()方法和set()方法示範程式:

代碼:

//a class called demo is defined
public class Demo
{
//main method is called
public static void main(String[] args)
{
//an instance of the ThreadLocal is created for a number
ThreadLocal<Number> local = new ThreadLocal<Number>();
//an instance of the ThreadLocal is created for a string
ThreadLocal<String> val = new ThreadLocal<String>();
//setting the first number value using set() method
local.set(100);
//obtaining the current thread's value which returns a number using get() method
System.out.println("The number value that was set is = " + local.get());
//setting the second number value using set() method
local.set(90);
//obtaining the current thread's value which returns a numberusing get() method
System.out.println("The number value that was set is = " + local.get());
//setting the first string value using set() method
val.set("Welcome to ThreadLocal");
//obtaining the current thread's value which returns a stringusing get() method
System.out.println("The string value that was set is = " + val.get());
//setting the second string value using set() method
val.set("Learning is fun");
//obtaining the current thread's value which returns a stringusing get() method
System.out.println("The string value that was set is = " + val.get());
}
}
登入後複製

輸出:

Java 執行緒局部

說明:在上面的程式中,定義了一個名為demo的類別。然後定義main方法。然後為某個數字建立 ThreadLocal 的實例。然後為字串建立 ThreadLocal 的實例。然後使用 set() 方法設定第一個數值。然後使用 get() 方法取得目前執行緒的返回數字的值。然後使用 set() 方法設定第二個數值。然後使用 get() 方法取得目前執行緒的返回數字的值。然後使用 set() 方法設定第一個字串值。然後使用 get() 方法取得目前執行緒的值,該值傳回一個字串。然後使用 set() 方法設定第二個字串值。然後使用 get() 方法取得目前執行緒的值,該值傳回一個字串。程式的輸出如上面的快照所示。

範例#2

Java程式示範ThreadLocal類別的remove()方法:

代碼:

//a class called demo is defined
public class Demo
{
//main method is called
public static void main(String[] args)
{
//an instance of the ThreadLocal is created for a number
ThreadLocal<Number> local = new ThreadLocal<Number>();
//an instance of the ThreadLocal is created for a string
ThreadLocal<String> val = new ThreadLocal<String>();
//setting the first number value using set() method
local.set(100);
//obtaining the current thread's value which returns a number using get() method
System.out.println("The first number value that was set is = " + local.get());
//setting the second number value using set() method
local.set(90);
//obtaining the current thread's value which returns a number using get() method
System.out.println("The second number value that was set is = " + local.get());
//setting the first string value using set() method
val.set("Welcome to ThreadLocal");
//obtaining the current thread's value which returns a string using get() method
System.out.println("The first string value that was set is = " + val.get());
//Using remove() method to remove the first string value that was set using set() method
val.remove();
//obtaining the current thread's value which returns a string using get() method
System.out.println("The first string value after using remove() method is = " + val.get());
//Using remove() method to remove the first number value and second number value that was set using set() method
local.remove();
//obtaining the current thread's value using get() method
System.out.println("The first number value and second number value after using remove() method is = " + local.get());
}
}
登入後複製

輸出:

Java 執行緒局部

說明:在上面的程式中,定義了一個名為demo的類別。然後定義main方法。然後為某個數字建立 ThreadLocal 的實例。然後為字串建立 ThreadLocal 的實例。然後使用 set() 方法設定第一個數值。然後使用 get() 方法取得目前執行緒的返回數字的值。然後使用 set() 方法設定第二個數值。然後使用 get() 方法取得目前執行緒的返回數字的值。然後使用 set() 方法設定第一個字串值。

然後使用remove()方法刪除使用set()方法設定的第一個字串值。然後使用get()方法取得目前執行緒的值,它傳回null,因為我們刪除了使用remove()方法設定的值。然後使用remove()方法刪除使用set()方法設定的第一個數值和第二個數值。然後使用get()方法取得目前執行緒的值,它傳回null,因為我們刪除了使用remove()方法設定的值。程式的輸出如上面的快照所示。

Java中ThreadLocal類別的優點

  • ThreadLocal 類別讓多執行緒任務變得更容易,因為物件的狀態不在執行緒之間共用。
  • 不需要同步,因為物件的狀態不在執行緒之間共用。
  • ThreadLocal 避免了一個物件暴露給多個執行緒。

結論

在本教學課程中,我們透過程式設計範例及其輸出來了解 ThreadLocal 類別的定義、ThreadLocal 類別的工作原理及其方法。

以上是Java 執行緒局部的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板