电竞比分网-中国电竞赛事及体育赛事平台

分享

Session 和SessonFactory 的多線程問(wèn)題

 昵稱22369024 2015-05-03
  Session是非線程安全的,生命周期比較短,代表和數(shù)據(jù)庫(kù),在B/S系統(tǒng)一般不會(huì)超過(guò)一個(gè)請(qǐng)求,
    內(nèi)部維護(hù)一級(jí)緩存和數(shù)據(jù)庫(kù)連接,如果session開(kāi)啟的時(shí)間過(guò)長(zhǎng),會(huì)長(zhǎng)時(shí)間占用緩存和數(shù)據(jù)庫(kù)連接池
    
    SessionFactory是線程安全的,一個(gè)線程在使用的話其他線程必須得等待
    String,Interger等不能修改的類,也是線程安全的,String的substring會(huì)產(chǎn)生一個(gè)新的對(duì)象,原來(lái)的對(duì)象時(shí)不會(huì)變的;
    即每一個(gè)線程自己用自己的對(duì)象,不會(huì)出現(xiàn)數(shù)據(jù)混亂的情況;
    另外一種只讀的類也是線程安全的,假設(shè)有個(gè)JavaBean只提供了getXX方法,沒(méi)有setXX大家都只會(huì)讀,不會(huì)修改數(shù)據(jù),也是線程安全的類
    大家知道servlet,filter,包括擴(kuò)struts1里面的Action,都是單例模式的,即web容器啟動(dòng)之后這些類只會(huì)創(chuàng)建一個(gè)對(duì)象,但每來(lái)一個(gè)請(qǐng)求Web容器就創(chuàng)建一個(gè)線程,然后呢把這寫對(duì)象傳給它讓它去處理,這樣就會(huì)有多個(gè)線程同時(shí)去訪問(wèn)一個(gè)實(shí)例的問(wèn)題,這個(gè)時(shí)候在一個(gè)實(shí)例里面就不能夠定義這種即能讀又能寫的屬性;假如struts1里面的Action里面定義一個(gè)變量來(lái)記錄這個(gè)Action被使用了多少次 即:

class MyAction Extends Action

{

    private int count;

    public String execute()

    {

        count++;

    }

}

 

    會(huì)出現(xiàn)多線程并發(fā)的問(wèn)題,包括我們用的servlet,F(xiàn)ilter,都存在這種問(wèn)題,在他們里面都不能定義這種即可讀又可寫的屬性,但我們可以定義成
    可讀的,假如說(shuō)上面的count 改為:final 類型的,程序中只用它,不修改它這樣的程序是不會(huì)存在問(wèn)題的:

class MyAction Extends Action{

    private final int count;

    public String execute()

    {

        int b=count

    }

}


    
        在struts2里面Action是多實(shí)例的,每來(lái)一個(gè)請(qǐng)求web容器就創(chuàng)建一個(gè)線程,但是會(huì)給每一個(gè)線程創(chuàng)建一個(gè)對(duì)象
    所以在struts2的Action里面可以定義很多的成員變量,(其實(shí)回憶一下使用struts2時(shí),我們沒(méi)有了FormBean而是把所有的屬性都放在了Action當(dāng)中去了
    

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多