您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“怎么實(shí)現(xiàn)java線程封閉”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么實(shí)現(xiàn)java線程封閉”吧!
多線程訪問共享可變數(shù)據(jù)時(shí),并不是所有的時(shí)候,都要用到共享數(shù)據(jù), 所以線程封閉的概念就提了出來。 所謂線程封閉, 就是指數(shù)據(jù)都封閉在各自的線程之中, 不需要不需要同步。線程封閉的具體的實(shí)現(xiàn)主要有ThreadLocal和局部變量
ThreadLocal是Java里一種特殊的變量,一個(gè)線程級別的變量,每個(gè)線程都有一個(gè)自己獨(dú)立的ThreadLocal變量。它的競爭條件被徹底消除, 在并發(fā)模式下是絕對安全的。 用法:ThreadLocal<T> var = new ThreadLocal<T>();
會自動在每個(gè)線程上創(chuàng)建一個(gè)T的副本, 副本之間彼此獨(dú)立,互不影響。 可以用ThreadLocal存儲一些參數(shù),以便在線程中多個(gè)方法中使用, 用來代替方法傳參的的做法
代碼示例:
/** 線程封閉示例 */ public class Demo6 { /** threadLocal變量,每個(gè)線程都有一個(gè)副本,互不干擾 */ public static ThreadLocal<String> value = new ThreadLocal<>(); /** * threadlocal測試 * * @throws Exception */ public void threadLocalTest() throws Exception { // threadlocal線程封閉示例 value.set("這是主線程設(shè)置的123"); // 主線程設(shè)置值 String v = value.get(); System.out.println("線程1執(zhí)行之前,主線程取到的值:" + v); new Thread( new Runnable() { @Override public void run() { String v = value.get(); System.out.println("線程1取到的值:" + v); // 設(shè)置 threadLocal value.set("這是線程1設(shè)置的456"); v = value.get(); System.out.println("重新設(shè)置之后,線程1取到的值:" + v); System.out.println("線程1執(zhí)行結(jié)束"); } }) .start(); Thread.sleep(5000L); // 等待所有線程執(zhí)行結(jié)束 v = value.get(); System.out.println("線程1執(zhí)行之后,主線程取到的值:" + v); } public static void main(String[] args) throws Exception { new Demo6().threadLocalTest(); } }
輸出結(jié)果:
線程1執(zhí)行之前,主線程取到的值:這是主線程設(shè)置的123 線程1取到的值:null 重新設(shè)置之后,線程1取到的值:這是線程1設(shè)置的456 線程1執(zhí)行結(jié)束 線程1執(zhí)行之后,主線程取到的值:這是主線程設(shè)置的123
局部變量的固有屬性之一就是封閉在線程中 它們位于執(zhí)行線程的棧中, 其他線程無法訪問這個(gè)棧
到此,相信大家對“怎么實(shí)現(xiàn)java線程封閉”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。