激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務(wù)器之家 - 編程語言 - Java教程 - Java ThreadLocal的設(shè)計理念與作用

Java ThreadLocal的設(shè)計理念與作用

2021-07-25 16:05我是一只小兔紙咿呀咿呀 Java教程

這篇文章主要介紹了Java ThreadLocal的設(shè)計理念與作用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

java中的threadlocal類允許我們創(chuàng)建只能被同一個線程讀寫的變量。因此,如果一段代碼含有一個threadlocal變量的引用,即使兩個線程同時執(zhí)行這段代碼,它們也無法訪問到對方的threadlocal變量。

如何創(chuàng)建threadlocal變量

以下代碼展示了如何創(chuàng)建一個threadlocal變量:

?
1
private threadlocal mythreadlocal = new threadlocal();

我們可以看到,通過這段代碼實例化了一個threadlocal對象。我們只需要實例化對象一次,并且也不需要知道它是被哪個線程實例化。雖然所有的線程都能訪問到這個threadlocal實例,但是每個線程卻只能訪問到自己通過調(diào)用threadlocal的set()方法設(shè)置的值。即使是兩個不同的線程在同一個threadlocal對象上設(shè)置了不同的值,他們?nèi)匀粺o法訪問到對方的值。

如何訪問threadlocal變量

一旦創(chuàng)建了一個threadlocal變量,你可以通過如下代碼設(shè)置某個需要保存的值:

?
1
mythreadlocal.set("a thread local value”);

可以通過下面方法讀取保存在threadlocal變量中的值:

?
1
string threadlocalvalue = (string) mythreadlocal.get();

get()方法返回一個object對象,set()對象需要傳入一個object類型的參數(shù)。

為threadlocal指定泛型類型

我們可以創(chuàng)建一個指定泛型類型的threadlocal對象,這樣我們就不需要每次對使用get()方法返回的值作強制類型轉(zhuǎn)換了。下面展示了指定泛型類型的threadlocal例子:

?
1
private threadlocal mythreadlocal = new threadlocal<string>();

現(xiàn)在我們只能往threadlocal對象中存入string類型的值了。

并且我們從threadlocal中獲取值的時候也不需要強制類型轉(zhuǎn)換了。

如何初始化threadlocal變量的值

由于在threadlocal對象中設(shè)置的值只能被設(shè)置這個值的線程訪問到,線程無法在threadlocal對象上使用set()方法保存一個初始值,并且這個初始值能被所有線程訪問到。

但是我們可以通過創(chuàng)建一個threadlocal的子類并且重寫initialvalue()方法,來為一個threadlocal對象指定一個初始值。就像下面代碼展示的那樣:

?
1
2
3
4
5
6
7
8
9
10
11
private threadlocal mythreadlocal = new threadlocal<string>() {
 
  @override
 
  protected string initialvalue() {
 
    return "this is the initial value";
 
  }
 
};

一個完整的threadlocal例子

下面是一個完整的可執(zhí)行的threadlocal例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class threadlocalexample {
 
  public static class myrunnable implements runnable {
 
 
    private threadlocal threadlocal = new threadlocal();
 
    @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();
 
  }
 
}

上面的例子創(chuàng)建了一個myrunnable實例,并將該實例作為參數(shù)傳遞給兩個線程。兩個線程分別執(zhí)行run()方法,并且都在threadlocal實例上保存了不同的值。如果它們訪問的不是threadlocal對象并且調(diào)用的set()方法被同步了,則第二個線程會覆蓋掉第一個線程設(shè)置的值。但是,由于它們訪問的是一個threadlocal對象,因此這兩個線程都無法看到對方保存的值。也就是說,它們存取的是兩個不同的值。

關(guān)于inheritablethreadlocal

inheritablethreadlocal類是threadlocal類的子類。threadlocal中每個線程擁有它自己的值,與threadlocal不同的是,inheritablethreadlocal允許一個線程以及該線程創(chuàng)建的所有子線程都可以訪問它保存的值。

以上所述是小編給大家介紹的java threadlocal的設(shè)計理念與作用詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務(wù)器之家網(wǎng)站的支持!

原文鏈接:https://blog.csdn.net/u011860731/article/details/48733073

延伸 · 閱讀

精彩推薦
542
主站蜘蛛池模板: 色综合久久久久综合99 | 精品在线免费播放 | 成人三级电影在线 | 成人国产免费观看 | 亚洲网站在线 | 久久久久97国产精 | 久色一区| 女教师~淫辱の动漫在线 | 成人免费毛片明星色大师 | 久久免费视频在线 | 大片毛片| 久久免费视频一区二区三区 | 龙床上的呻吟高h | 欧美精品日日鲁夜夜添 | 视频一区 日韩 | 成人毛片视频在线观看 | 狠狠干五月天 | 密室逃脱第一季免费观看完整在线 | 国产一区二区免费看 | 精品国产一区二区三区天美传媒 | 国产成人在线网址 | 久久99精品国产自在现线 | 精品一区二区三区欧美 | 国产精品刺激对白麻豆99 | 国产深夜福利视频在线播放 | 九九热免费精品 | 精品国产一区二区亚洲人成毛片 | 日本在线播放一区 | www.17c亚洲蜜桃 | 在线视频 日韩 | 亚洲网站在线观看视频 | omofun 动漫在线观看 | 99精品欧美一区二区 | 国产成人强伦免费视频网站 | 久久人操 | 色偷偷欧美| 国产a级片电影 | 成人午夜亚洲 | 国产成人高潮免费观看精品 | 红杏网站永久免费视频入口 | 97青青草视频 |