有狀態對象和無狀態對象

1、進程與線程的關係

進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動, 進程是系統進行資源分配和調度的一個獨立單位.
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.
另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
進程有獨立的地址空間

進程有單獨的地址空間,包括文本區域(text region)、數據區域(data region)和堆棧(stack region)。
文本區域存儲處理器執行的代碼;
數據區域存儲變量和進程執行期間使用的動態分配的內存;
堆棧區域存儲着活動過程調用的指令和本地變量。

線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間

一個線程包含以下內容。
一個指向當前被執行指令的指令指針;
一個棧;
一個寄存器值的集合,定義了一部分描述正在執行線程的處理器狀態的值;
一個私有的數據區。

2、線程安全

  如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,那麼就是線程安全的。 一個類或者程序所提供的接口對於線程來說是原子操作或者多個線程之間的切換不會導致該接口的執行結果存在二義性,也就是說我們不用考慮同步的問題。
  線程安全問題都是由全局變量及靜態變量引起的。 若每個線程中對全局變量、靜態變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執行寫操作,一般都需要考慮線程同步,否則就可能影響線程安全。

3、關於線程安全

1) 常量始終是線程安全的,因爲只存在讀操作。
2) 每次調用方法前都新建一個實例是線程安全的,因爲不會訪問共享的資源(共享堆內存)。
3) 局部變量是線程安全的。因爲每執行一個方法,都會在獨立的空間創建局部變量,它不是共享的資源。局部變量包括方法的參數變量和方法內變量。

3、有狀態和無狀態對象

  有狀態就是有數據存儲功能。有狀態對象(Stateful Bean),就是有實例變量(成員變量)的對象 ,可以保存數據,是非線程安全的。在不同方法調用間不保留任何狀態。其實就是有數據成員的對象。

  無狀態就是一次操作,不能保存數據。無狀態對象(Stateless Bean),就是沒有實例變量(成員變量)的對象。不能保存數據,是不變類,是線程安全的。具體來說就是隻有方法沒有數據成員的對象,或者有數據成員但是數據成員是可讀的對象。

代碼如下

/** 
 * 有狀態bean,有state,user等屬性,並且user有存偖功能,是可變的。 user是MVC中的M,實體類,有數據庫表* 的屬性和屬性的setter、getter方法,可以存儲數據,屬於有狀態;屬於線程不安全。
*/
public class StatefulBean {  

    public int state;  
    // 由於多線程環境下,user是引用對象,是非線程安全的  
    public User user;  

    public int getState() {  
        return state;  
    }  

    public void setState(int state) {  
        this.state = state;  
    }  

    public User getUser() {  
        return user;  
    }  

    public void setUser(User user) {  
        this.user = user;  
    }  
}  

/** 
 * 無狀態bean,不能存偖數據。因爲沒有任何屬性,所以是不可變的。只有一系統的方法操作。 
 *   BillDao是dao層類,有一些find,add,save方法。dao本身也是單例的,屬於無狀態;不存在線程安全問題。
 *  /

public class StatelessBeanService {  

    // 雖然有BillDao屬性,但billDao是沒有狀態信息的,是Stateless Bean.  
    BillDao billDao;  

    public BillDao getBillDao() {  
        return billDao;  
    }  

    public void setBillDao(BillDao billDao) {  
        this.billDao = billDao;  
    }  

    public List<User> findUser(String Id) {  
         return null;  
    }  
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章