黑子的程序員生涯

          努力保持編程中美好的感覺

          Web服務(wù)器開發(fā)環(huán)境下的線程安全問題

          Servlet是在多線程環(huán)境下的。即可能有多個請求發(fā)給一個servelt實例,每個請求是一個線程。
          struts下的action也類似,同樣在多線程環(huán)境下。可以參考struts user guide: http://struts.apache.org/struts-action/userGuide/building_controller.html 中的Action Class Design Guidelines一節(jié):? 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.
          譯:為多線程環(huán)境編寫代碼。我們的controller servlet指揮創(chuàng)建你的Action 類的一個實例,用此實例來服務(wù)所有的請求。因此,你必須編寫線程安全的Action類。遵循與寫線程安全的servlet同樣的方針。
          ?
          1.什么是線程安全的代碼
          ? 在多線程環(huán)境下能正確執(zhí)行的代碼就是線程安全的。
          ? 安全的意思是能正確執(zhí)行,否則后果是程序執(zhí)行錯誤,可能出現(xiàn)各種異常情況。

          2.如何編寫線程安全的代碼
          ? 很多書籍里都詳細講解了如何這方面的問題,他們主要講解的是如何同步線程對共享資源的使用的問題。主要是對synchronized關(guān)鍵字的各種用法,以及鎖的概念。
          ? Java1.5中也提供了如讀寫鎖這類的工具類。這些都需要較高的技巧,而且相對難于調(diào)試。
          ?
          ? 但是,線程同步是不得以的方法,是比較復(fù)雜的,而且會帶來性能的損失。等效的代碼中,不需要同步在編寫容易度和性能上會更好些。
          ? 我這里強調(diào)的是什么代碼是始終為線程安全的、是不需要同步的。如下:
          ? 1)常量始終是線程安全的,因為只存在讀操作。
          ? 2)對構(gòu)造器的訪問(new 操作)是線程安全的,因為每次都新建一個實例,不會訪問共享的資源。
          ? 3)最重要的是:局部變量是線程安全的。因為每執(zhí)行一個方法,都會在獨立的空間創(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類中只使用局部變量,不使用實例變量。

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

          posted on 2006-06-09 15:20 黑子 閱讀(1201) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 台南县| 丰都县| 陇西县| 永城市| 临泉县| 崇礼县| 嵊州市| 陆良县| 大丰市| 青岛市| 德保县| 大方县| 灵台县| 海口市| 津市市| 泸州市| 五华县| 嘉善县| 舟曲县| 揭东县| 乌拉特中旗| 苏尼特左旗| 米林县| 贵溪市| 原平市| 宣汉县| 锡林郭勒盟| 太白县| 仪征市| 黄冈市| 基隆市| 淄博市| 凤庆县| 和田市| 荆州市| 怀化市| 剑阁县| 江安县| 黑水县| 项城市| 鄢陵县|