Structs的線程安全問題

          以前做過Structs 的項(xiàng)目,可是一直沒做太深的研究,尤其是關(guān)于線程安全的
          在網(wǎng)上搜了一下很多這方面的資料,引用了一些,總結(jié)了一下:

          總結(jié):Struts1 Action是單例模式并且必須是線程安全的,因?yàn)閮H有Action的一個(gè)實(shí)例來處理所有的請求。單例策略限制了Struts1 Action能作的事,并且要在開發(fā)時(shí)特別小心。Action資源必須是線程安全的或同步的。
          Struts2 Action可以使用原型模式scope=prototype,這樣對象為每一個(gè)請求產(chǎn)生一個(gè)實(shí)例,因此沒有線程安全問題。(實(shí)際上,servlet容器給每個(gè)請求產(chǎn)生許多可丟棄的對象,并且不會(huì)導(dǎo)致性能和垃圾回收問題)

           

          這篇文章對什么是線程安全的代碼和如何使用線程安全的代碼做了詳細(xì)闡述
          http://hi.baidu.com/niujunkai/blog/item/021964adc130660a4a36d6ab.html
          下面是它內(nèi)容的引用:

          引用:

          1.什么是線程安全的代碼
          在多線程環(huán)境下能正確執(zhí)行的代碼就是線程安全的。
          安全的意思是能正確執(zhí)行,否則后果是程序執(zhí)行錯(cuò)誤,可能出現(xiàn)各種異常情況。

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

          但是,線程同步是不得以的方法,是比較復(fù)雜的,而且會(huì)帶來性能的損失。等效的代碼中,不需要同步在編寫容易度和性能上會(huì)更好些。
          我這里強(qiáng)調(diào)的是什么代碼是始終為線程安全的、是不需要同步的。如下:
          1)常量始終是線程安全的,因?yàn)橹淮嬖谧x操作。
          2)對構(gòu)造器的訪問(new 操作)是線程安全的,因?yàn)槊看味夹陆ㄒ粋€(gè)實(shí)例,不會(huì)訪問共享的資源。
          3)最重要的是:局部變量是線程安全的。因?yàn)槊繄?zhí)行一個(gè)方法,都會(huì)在獨(dú)立的空間創(chuàng)建局部變量,它不是共享的資源。局部變量包括方法的參數(shù)變量。
          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類中只使用局部變量,不使用實(shí)例變量。


          總結(jié):
          在Java的Web服務(wù)器環(huán)境下開發(fā),要注意線程安全的問題。最簡單的實(shí)現(xiàn)方式就是在Servlet和Struts Action里不要使用類變量、實(shí)例變量,但可以使用類常量和實(shí)例常量。如果有這些變量,可以將它們轉(zhuǎn)換為方法的參數(shù)傳入,以消除它們。
          注意一個(gè)容易混淆的地方:被Servlet或Action調(diào)用的類中(如值對象、領(lǐng)域模型類)中是否可以安全的使用實(shí)例變量?如果你在每次方法調(diào)用時(shí)
          新建一個(gè)對 象,再調(diào)用它們的方法,則不存在同步問題---因?yàn)樗鼈儾皇嵌鄠€(gè)線程共享的資源,只有共享的資源才需要同步---而Servlet和Action的實(shí)例對于多個(gè)線程是共享 的。
          換句話說,Servlet和Action的實(shí)例會(huì)被多個(gè)線程同時(shí)調(diào)用,而過了這一層,如果在你自己的代碼中沒有另外啟動(dòng)線程,且每次調(diào)用后續(xù)業(yè)務(wù)對象時(shí)都是先 新建一個(gè)實(shí)例再調(diào)用,則都是線程安全的。

           

          如果想加深理解servlet的多線程可以讀讀此文,闡述的很詳細(xì)。
          http://hi.baidu.com/platon/blog/item/64a20ff3f96e7fce0b46e031.html

          posted on 2009-10-29 16:26 AK47 閱讀(1043) 評論(0)  編輯  收藏 所屬分類: Structs

          <2009年10月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 桐梓县| 深圳市| 临夏县| 凭祥市| 神农架林区| 额敏县| 西吉县| 五大连池市| 工布江达县| 化德县| 南漳县| 南澳县| 澄江县| 色达县| 罗江县| 泾阳县| 德钦县| 和田县| 梁河县| 怀集县| 岑溪市| 崇明县| 民丰县| 贵州省| 屏南县| 大城县| 广安市| 平阴县| 莫力| 贵州省| 东海县| 宁南县| 汾阳市| 广宁县| 庆城县| 北宁市| 金乡县| 阆中市| 安泽县| 平定县| 光泽县|