物件的狀態特性

2021-07-05 16:23:20 字數 2298 閱讀 3894

物件狀態的變化一般是由你關心的某屬性變化引起的,無狀態的物件一般是不可變物件,不可變物件是執行緒安全的。

無狀態的物件,是乙個物件,並且這個物件沒有狀態!

通常情況,幾乎所有物件都有狀態,

比如乙個人,按照不同的情況有多種狀態,比如高矮、胖瘦、黑白、高富帥窮矮挫。

比如乙個杯子,玻璃的還是塑料,圓的還是方的。

你可以想一下,生活中哪些物件是無狀態的?

抽象到程式設計中,無狀態的物件,我們往往僅僅考慮物件的乙個切面,

比如乙個user,有多個屬性,name,age等等,只要你認為這些屬性的變化對user的唯一認定沒有影響,那這些屬性,就不會影響user的狀態,意思是說這個user的狀態我不關心這些屬性,那這些屬性的變更不能成為影響user的狀態的必要因素。

比如user乙個age達到18歲了,我認為這個user的狀態變化了,是成年人了,那麼這個user是有狀態的,狀態就是是否成年,活著你認為age多少歲無關緊要,那麼這個user就是沒有狀態的。

或者就是有例項變數,不能改寫,如private的,對外只暴露唯讀操作,無寫操作。

有狀態和無狀態物件

有狀態就是有資料儲存功能。有狀態物件(stateful bean),就是有例項變數的物件  ,可以儲存資料,是非執行緒安全的。在不同方法呼叫間不保留任何狀態。

無狀態就是一次操作,不能儲存資料。無狀態物件(stateless bean),就是沒有例項變數的物件  .不能儲存資料,是不變類,是執行緒安全的。

有狀態物件:

/** 

* 有狀態bean,有state,user等屬性,並且user有存偖功能,是可變的。

*  * @author peter wei

*  */  

public class statefulbean  

public void setstate(int state)  

public user getuser()  

public void setuser(user user)  

}

無狀態物件

/** 

* 無狀態bean,不能存偖資料。因為沒有任何屬性,所以是不可變的。只有一系統的方法操作。

*  * @author peter wei

*  */  

public class statelessbeanservice  

public void setbilldao(billdao billdao)  

public listfinduser(string id)  

}

單例類可以是有狀態的(stateful),也可以是無狀態的。無狀態的單例模式,是執行緒安全的。有狀態的單例模式,是非執行緒安全的。

spring中的有狀態(stateful)和無狀態(stateless)

1.通過上面的分析,相信大家已經對有狀態和無狀態有了一定的理解。無狀態的bean適合用不變模式,技術就是單例模式,這樣可以共享例項,提高效能。有狀態的bean,多執行緒環境下不安全,那麼適合用prototype原型模式。prototype: 每次對bean的請求都會建立乙個新的bean例項。

2.預設情況下,從spring bean工廠所取得的例項為singleton(scope屬性為singleton),容器只存在乙個共享的bean例項。

3.理解了兩者的關係,那麼scope選擇的原則就很容易了:有狀態的bean都使用prototype作用域,而對無狀態的bean則應該使用singleton作用域。

4.如service層、dao層用預設singleton就行,雖然service類也有dao這樣的屬性,但dao這些類都是沒有狀態資訊的,也就是 相當於不變(immutable)類,所以不影響。struts2中的action因為會有user、bizentity這樣的例項物件,是有狀態資訊 的,在多執行緒環境下是不安全的,所以struts2預設的實現是prototype模式。在spring中,struts2的action中,scope 要配成prototype作用域。

總結: 

stateless無狀態用單例singleton模式,stateful有狀態就用原型prototype模式。

stateful 有狀態是多執行緒編碼的天敵,所以在開發中盡量用stateless無狀態,無狀態是不變(immutable)模式的應用,有很多優點:不用管線程和同步的問題  ,如果值是不可變的,程式不用擔心多個執行緒改變共享狀態,所以可以避免執行緒競爭的bugs. 因為沒有競爭,就不用用locks等機制,所以無狀態的不變機制,也可以避免產生死鎖現象。

狀態無關特性

時不時的就會發現一些例證來一遍一遍的教導自己 道理都是相通的 cpu受限於製造工藝的精細程度,因而提高效能的著眼點放在了並行處理上。但是並行不是說並性就可以並行的,比如python裡面為了保證資料安全,必須有乙個gil全域性解釋鎖的存在,導致乙個python直譯器同一時間只能使用乙個cpu。那為什麼...

有狀態物件和狀態物件

本部落格 有狀態就是有資料儲存功能。有狀態物件 stateful bean 就是有例項變數的物件 可以儲存資料,是非執行緒安全的。在不同方法呼叫間不保留任何狀態。其實就是有資料成員的物件。無狀態就是一次操作,不能儲存資料。無狀態物件 stateless bean 就是沒有例項變數的物件。不能儲存資料...

物件導向的特性

1.抽象 抽象就是忽略乙個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是資料抽象。2.繼承 繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方...