關於struts線程問題

來源:互聯網
上載者:User
關於struts線程問題

Servlet是在多線程環境下的。即可能有多個請求發給一個servelt執行個體,每個請求是一個線程。
struts下的action也類似,同樣在多線程環境下。可以參考struts user guide: http://struts.apache.org/struts-action/userGuide/building_controller.html 中的Action Class Design Guidelines一節: Write code for a multi-threaded environment - Our controller servlet creates only one instance of your Action class, and uses this one instance to service all requests. Thus, you need to write thread-safe Action classes. Follow the same guidelines you would use to write thread-safe Servlets.
譯:為多線程環境編寫代碼。我們的controller servlet指揮建立你的Action 類的一個執行個體,用此執行個體來服務所有的請求。因此,你必須編寫安全執行緒的Action類。遵循與寫安全執行緒的servlet同樣的方針。

1.什麼是安全執行緒的代碼
在多線程環境下能正確執行的代碼就是安全執行緒的。
安全的意思是能正確執行,否則後果是程式執行錯誤,可能出現各種異常情況。

2.如何編寫安全執行緒的代碼
很多書籍裡都詳細講解了如何這方面的問題,他們主要講解的是如何同步線程對共用資源的使用的問題。主要是對synchronized關鍵字的各種用法,以及鎖的概念。
Java1.5中也提供了如讀寫鎖這類的工具類。這些都需要較高的技巧,而且相對難於調試。

但是,線程同步是不得以的方法,是比較複雜的,而且會帶來效能的損失。等效的代碼中,不需要同步在編寫容易度和效能上會更好些。
我這裡強調的是什麼代碼是始終為安全執行緒的、是不需要同步的。如下:
1)常量始終是安全執行緒的,因為只存在讀操作。
2)對構造器的訪問(new 操作)是安全執行緒的,因為每次都建立一個執行個體,不會訪問共用的資源。
3)最重要的是:局部變數是安全執行緒的。因為每執行一個方法,都會在獨立的空間建立局部變數,它不是共用的資源。局部變數包括方法的參數變數。
struts user guide裡有:
Only Use Local Variables - The most important principle that aids in thread-safe coding is to use only local variables, not instance variables , in your Action class.
譯:只使用用局部變數。--編寫安全執行緒的代碼最重要的原則就是,在Action類中只使用局部變數,不使用執行個體變數。

總結:
在Java的Web伺服器環境下開發,要注意安全執行緒的問題。最簡單的實現方式就是在Servlet和Struts Action裡不要使用類變數、執行個體變數,但可以使用類常量和執行個體常量。如果有這些變數,可以將它們轉換為方法的參數傳入,以消除它們。
注意一個容易混淆的地方:被Servlet或Action調用的類中(如值對象、領域模型類)中是否可以安全的使用執行個體變數?如果你在每次方法調用時
建立一個對象,再調用它們的方法,則不存在同步問題---因為它們不是多個線程共用的資源,只有共用的資源才需要同步---而Servlet和Action的執行個體對於多個線程是共用的。
換句話說,Servlet和Action的執行個體會被多個線程同時調用,而過了這一層,如果在你自己的代碼中沒有另外啟動線程,且每次調用後續業務對象時都是先建立一個執行個體再調用,則都是安全執行緒的。
=================================================
以上是我找到令我自己滿意的答案!!!
2)對構造器的訪問(new 操作)是安全執行緒的”
我想只有這一句話就夠了!!

非常全面,不錯。

_________________________________________________________
對構造器的訪問(new 操作)是安全執行緒的
每次調用後續業務對象時都是先建立一個執行個體再調用,則都是安全執行緒的
這是正確的,這隻是在Jsp+JavaBeans架構下適用。

通過new建立對象有很多設計問題,因此,實戰中我們現在基本不通過new來獲得對象。
既然不通過new獲得對象,那麼如何保證Struts線程問題?

原則就是:
一個請求一個線程,一個業務對象,一個資源,就象專用通道一樣。
這裡涉及對象多例、單例等複雜問題。

-------------------------------------------------------------------------------

當用spring向struts裡注入業務對象時,通常都是把這個業務對象作為成員變數注入
但是struts的文檔上有這麼一句話:

Actions must be programmed in a thread safe manner(方式), because the controller will share the same instance for multiple(多個) simultaneous(同時發生的) requests.Instance and static variables must not be used to store information related to the state of a particular request(譯:由於在同時發生的多個請求中,controller會共用同一個執行個體(instance ),因此 Actions 必須在以一個安全執行緒的方式運行。)

安全執行緒的做法:

1。可以用同步
2。在spring的設定檔中將bean的singleton設為false,如<beanid=""class=""singleton="false">
這樣在容器中每次產生的bean都是一個新的執行個體。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.