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

 
 
posted @ 2019-10-13 11:00  楼兰胡杨  阅读(3655)  评论(0编辑  收藏  举报