ASP.NET線程安全所涉及的是什么呢?讓我們先來看看靜態(tài)變量的生命周期問題,下面是我理解的靜態(tài)變量的生命周期:
void application_Start開始
void Application_End結(jié)束的,本來這就是對的
今天要做一個全局的應(yīng)用,想確認(rèn)一下,在網(wǎng)上一找,我的天,說什么的都有
大概分三種
1.Application_Start——Application_End
2.session_Start——Session_End
3.類生命周期結(jié)束
我用4個機(jī)器做了一個測試發(fā)現(xiàn)靜態(tài)變量值一直是不變的,并沒有因為其它用戶登錄而被銷毀,確認(rèn)應(yīng)該是Application級的
靜態(tài)類在首次訪問時會調(diào)用靜態(tài)構(gòu)造器創(chuàng)建類類型對象,類型對象的生存周期是整個應(yīng)用程序域的生存周期,也就說被訪問過的靜態(tài)類,只有它所在的應(yīng)用程序域被卸載時才會被卸載。
類的成員分為兩類,靜態(tài)成員(static member)和實(shí)例成員(instance member)。靜態(tài)成員屬于類,實(shí)例成員則屬于對象,即類的實(shí)例。
簡單討論一下在一個類中使用靜態(tài)字段(static field)和靜態(tài)方法(static method)是否會有線程安全問題。
我們在知道, 靜態(tài)字段(static field)和靜態(tài)方法(static method)的調(diào)用是通過類來調(diào)用。靜態(tài)方法不對特定的實(shí)例操作,只能訪問靜態(tài)成員。實(shí)例方法可對特定的實(shí)例操作,既能訪問靜態(tài)成員,也能訪問實(shí)例成員。
那么,在多線程中使用靜態(tài)方法是否有ASP.NET線程安全問題?這要看靜態(tài)方法是是引起ASP.NET線程安全問題要看在靜態(tài)方法中是否使用了靜態(tài)成員。
因為,在多線程中使用同一個靜態(tài)方法時,每個線程使用各自的實(shí)例字段(instance field)的副本,而共享一個靜態(tài)字段(static field)。所以說,如果該靜態(tài)方法不去操作一個靜態(tài)成員,只在方法內(nèi)部使用實(shí)例字段(instance field),不會引起安全性問題。但是,如果該靜態(tài)方法操作了一個靜態(tài)字段,則需要靜態(tài)方法中采用互斥訪問的方式進(jìn)行安全處理。
舉個簡單的例子,我們使用的Console.WriteLine();中WriteLine()是Console.WriteLine類的靜態(tài)方法。
對于ASP.NET線程安全中, 多個客戶端訪問服務(wù)器端, 這是一個多線程的例子.只要理解了原因,我們可以在三層架構(gòu)中的數(shù)據(jù)訪問層中放心使用靜態(tài)方法(static method)來訪問數(shù)據(jù)庫.
靜態(tài)方法如果沒有使用靜態(tài)變量,則沒有線程安全問題。
為什么呢?因為靜態(tài)方法內(nèi)聲明的變量,每個線程調(diào)用時,都會新創(chuàng)建一份,而不會共用一個存儲單元。每個線程都會創(chuàng)建自己的一份,因此不會有線程安全問題
注意,靜態(tài)變量,由于是在類加載時占用一個存儲區(qū),每個線程都是共用這個存儲區(qū)的,所以如果在靜態(tài)方法里使用了靜態(tài)變量,這就會有線程安全問題!
ASP.NET線程安全及靜態(tài)變量生命周期就向你介紹到這,希望對你理解ASP.NET線程安全和靜態(tài)變量生命周期有所幫助。
本文轉(zhuǎn)自:http://developer.51cto.com/art/200907/140975.htm
新聞熱點(diǎn)
疑難解答