Java 有狀態和無狀態對象的區別


無狀態會話Bean 

  無狀態就是對於一次操作,不能保存數據。無狀態對象(Stateless Bean)是沒有實例變量的對象,不能保存數據,是不變類,是線程安全的。例如: 
public class A { public A() {} public String hello() { return "Hello 誰?"; } } public class Client { public Client() { A a = new A(); System.out.println(a.hello()); A b = new A(); System.out.println(b.hello()); } }

  在Client中生成了兩個A的實例,不管是對象a還是b,它們是沒有狀態的。對於Client來說a和b是沒有差別的(但a != b)。所以同一個無狀態會話Bean的實例都是相同的,可以被不同的客戶端重復使用。 

有狀態會話Bean 

 
  也稱為有狀態對象(Stateful Bean),就是有實例變量的對象,可以保存數據,是非線程安全的。在不同方法調用間不保留任何狀態。
public class B { private String name; public B(String arg) { this.name = arg; } public String hello() { return "Hello" + this.name; } } public class Client { public Client() { B a = new B("中國"); System.out.println(a.hello()); B b = new B("世界"); System.out.println(b.hello()); } } 

  其實線程池的概念同數據連接池概念基本相同,都是為了提高系統性能而設計的。就像是餃子館一樣,餃子的做法可以有兩種,一種是不管當前有沒有客人,先將一些餃子下鍋,等到客人就座后可以馬上撈出來給客人吃。還有一種是客人來后才將餃子下鍋。這個例子顯然不是十分恰當,但它的確能言簡意賅地說明問題。線程池的概念就像是餃子的第一種做法,先在線程池中初始化一些線程,具體初始化多少取決於配置,等到客戶端(消費者)調用時直接拿來使用。它和餃子的區別還是很大的,要是餃子下鍋后沒有客人來吃可慘了。

 

Reference

 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM