Session是非線程安全的,生命周期比較短,代表和數(shù)據(jù)庫,在B/S系統(tǒng)一般不會超過一個(gè)請求, 內(nèi)部維護(hù)一級緩存和數(shù)據(jù)庫連接,如果session開啟的時(shí)間過長,會長時(shí)間占用緩存和數(shù)據(jù)庫連接池 SessionFactory是線程安全的,一個(gè)線程在使用的話其他線程必須得等待 String,Interger等不能修改的類,也是線程安全的,String的substring會產(chǎn)生一個(gè)新的對象,原來的對象時(shí)不會變的; 即每一個(gè)線程自己用自己的對象,不會出現(xiàn)數(shù)據(jù)混亂的情況; 另外一種只讀的類也是線程安全的,假設(shè)有個(gè)JavaBean只提供了getXX方法,沒有setXX大家都只會讀,不會修改數(shù)據(jù),也是線程安全的類 大家知道servlet,filter,包括擴(kuò)struts1里面的Action,都是單例模式的,即web容器啟動(dòng)之后這些類只會創(chuàng)建一個(gè)對象,但每來一個(gè)請求Web容器就創(chuàng)建一個(gè)線程,然后呢把這寫對象傳給它讓它去處理,這樣就會有多個(gè)線程同時(shí)去訪問一個(gè)實(shí)例的問題,這個(gè)時(shí)候在一個(gè)實(shí)例里面就不能夠定義這種即能讀又能寫的屬性;假如struts1里面的Action里面定義一個(gè)變量來記錄這個(gè)Action被使用了多少次 即: class MyAction Extends Action { private int count; public String execute() { count++; } } 可讀的,假如說上面的count 改為:final 類型的,程序中只用它,不修改它這樣的程序是不會存在問題的: class MyAction Extends Action{ private final int count; public String execute() { int b=count; } } 在struts2里面Action是多實(shí)例的,每來一個(gè)請求web容器就創(chuàng)建一個(gè)線程,但是會給每一個(gè)線程創(chuàng)建一個(gè)對象 所以在struts2的Action里面可以定義很多的成員變量,(其實(shí)回憶一下使用struts2時(shí),我們沒有了FormBean而是把所有的屬性都放在了Action當(dāng)中去了 |
|