日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程静态的几个特点

發布時間:2023/12/19 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程静态的几个特点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
很多編碼規范上都指出不要使用線程靜態(ThreadStatic),這主要是為了防止在使用的時候出現意外。當有的時候這個線程靜態確實會帶來一些好處,如何取舍就要看具體情況了。
????? 首先,明確一點線程靜態與標準靜態之間的區別。線程靜態相當于變量有線程來負責保存,因此每個線程看到都可以是不同的,但在同一個線程內是相同的。而標準靜態實際上是應用程序域(AppDomain)負責保存的,因此在相同應用程序域中都看到相同的對象,而在多應用程序域的程序中,每個應用程序域中的值可以是不同的。
????? 兩者在作用范圍上的不同,導致了很多的特性上的不同。而這些通常會被混淆,這也就是為什么很多編程規范上指出不要使用線程靜態的一個根本原因之一吧。
????? 首先,兩種靜態的GC回收條件不同。線程靜態所在的那個線程一旦停止,GC就可以回收線程靜態所引用的對象了。而標準靜態只有在整個應用程序域被卸載的時候,GC才可以回收這些被引用的對象(如果是單個應用程序域的程序,就意味著必須等到整個應用程序退出)。當然,如果線程靜態是在應用程序的主線程上的話,GC就只能等到整個應用程序退出的時候了。
????? 第二,類型初始化時對靜態值的初始化效果不同。標準的靜態很好理解,只要做了初始化,那就一定是這個初始值。但線程靜態的類型初始化有點特別,類型初始化僅僅發生在第一次用到這個類型的線程上,因此,只有這個線程的線程靜態獲得了初始化,而其他線程上的這個線程靜態是未設值的狀態。
????? 第三,線程靜態的對象天生是線程安全的。例如,要做一個相對于線程來說SingleTon的對象,可以非常簡單的寫成:
public?class?Foo
{
????[ThreadStatic]
????
private?static?Foo?_instance;

????
private?Foo()?{?}

????
public?static?Foo?Instance
????{
????????
get
????????{
????????????
if?(_instance?==?null)
????????????????_instance?
=?new?Foo();
????????????
return?_instance?;
????????}
????}
}

????? Lock完全沒有存在的必要,因為不可能有兩個線程訪問到相同的_instance。

????? 第四,線程靜態容易犯以下錯誤:
????? 1、在不同的線程中期望獲得相同的值。
????????? 這個很好理解,使用者沒有搞清楚這是兩個完全不同的線程,這是個非常容易犯的錯誤。
????? 2、相同的線程中期望獲得不相同的值。
????????? 這個可能有點意外,使用者以為這是兩個不同的線程,結果卻相反。聽起來很荒謬,但確實有可能。如果這個兩個使用者以為的線程是通過線程池跑的,那就不難理解了吧。對線程池而言,它是用一個線程模擬了多個線程,因此在這些被模擬的線程上,線程靜態的值其實是同一個。

????? 可以看出,線程靜態還是有一定風險的用法,畢竟和基于應用程序域的靜態有著很大的不同。而且,在一定程度上影響了代碼的可讀性。所以除非有特別的需要,盡量應該避免線程靜態。




創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的线程静态的几个特点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。