線程安全:在多線程環境下能正確執行的代碼就是線程安全的,安全的意思就是能夠正確執行,程序代碼執行不出錯誤等其他異常情況
實例變量:在堆中分配的,並被屬於該實例的所有線程共享,所以不是線程安全的
局部變量:在堆棧中分配,因為每個實例都有它自己的堆棧空間,所以是線程安全的
J2EE是一個多線程的環境,服務器針對每個請求啟動一個線程來處理,所以有可能會有多個線程同時訪問一個Servlet實例的情況。在Struts裡面也是一樣的,有可能會有多個線程同時訪問一個Action實例的情況,這時就會出現線程安全的問題,所以要保證Action類中的方法具有“可重入性”,即不可以在Action的方法裡改變實例變量的值。
在設計Action類時應該注意:
1、不要使用實例或靜態變量存儲特定請求的狀態信息,因為它們會在同一個操作中共享跨越請求的全局資源,引發線程安全問題
2、如果並行訪問資源需要保護,訪問就要進行同步(例如:synchronized關鍵字的使用)
3、使用常量是線程安全的,因為只存在讀操作
4、對構造器的訪問(new 操作)是線程安全的,因為每次都創建一個實例,不會訪問共享資源
5、局部變量也是線程安全的。因為沒執行一個方法,都會在獨立的空間創建局部變量,它不是共享資源。局部變量包括方法的參數變量。