论坛首页 Java企业应用论坛

精通有状态vs无状态(Stateful vs Stateless)—Immutable模式之姐妹篇

浏览 27200 次
精华帖 (7) :: 良好帖 (4) :: 新手帖 (5) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-03-14  
oojdon 写道
比较浅显,要是结合用例,用户状态,应用事务,Restful,集群分布式,Seam对话模式等切入点来讲解有状态和无状态就好了。

这个要求太高了吧,哈哈。把这些都说完,也差不多可以写半本书了。我相信还是有很多人对这两个概念根本不懂,算是总结兼扫盲吧。
0 请登录后投票
   发表时间:2011-03-14  
有状态和无状态与线程安全是两个概念

首先有状态也可以是线程安全的,你可以加锁,也可以以只读模式访问,例如:

class StatelessBean {

  Properties props;

  public StatelessBean() {
    initProps();
  }
}


因为有成员变量props,所有该Bean从编程角度说是有状态的,但是你只在构造方法中初始化他,然后其他方法均不修改,这样就是线程安全的。从业务角度说,这个Bean是无状态的,因为他的状态不变,不管几个客户端访问,也无论是否并发访问

从编程模型说spring里的bean都是可变的,通常也都是有状态的,但是,只要从业务上保证是无状态的,就可以简单做服务器叠加。单机下就可以用多进程模拟。

其实正确的目标是追求无状态的服务,只要牢记永远不要使用Servlet的Session,这样从大方向上说就变成无状态了
0 请登录后投票
   发表时间:2011-03-14   最后修改:2011-03-14
asklxf 写道
有状态和无状态与线程安全是两个概念

首先有状态也可以是线程安全的,你可以加锁,也可以以只读模式访问,例如:

class StatelessBean {

  Properties props;

  public StatelessBean() {
    initProps();
  }
}


因为有成员变量props,所有该Bean从编程角度说是有状态的,但是你只在构造方法中初始化他,然后其他方法均不修改,这样就是线程安全的。从业务角度说,这个Bean是无状态的,因为他的状态不变,不管几个客户端访问,也无论是否并发访问

从编程模型说spring里的bean都是可变的,通常也都是有状态的,但是,只要从业务上保证是无状态的,就可以简单做服务器叠加。单机下就可以用多进程模拟。

其实正确的目标是追求无状态的服务,只要牢记永远不要使用Servlet的Session,这样从大方向上说就变成无状态了

恩,你说的是对的。我并没有把有状态和无状态与线程安全是两个概念等同起来。有状态当然可以是线程安全的,请看我例子中的有状态的单例TaskCache,里面的ExpiredMap,AtomicLong就是属性,也就是有状态。但那两个东东都是基于线程安全实现的。
引用
因为有成员变量props,所有该Bean从编程角度说是有状态的,但是你只在构造方法中初始化他,然后其他方法均不修改,这样就是线程安全的。从业务角度说,这个Bean是无状态的,因为他的状态不变,不管几个客户端访问,也无论是否并发访问

事实并不是这样的,如果说只在构造方法中初始化他,然后其他方法均不修改,那么他只是弱不变模式。props是引用对象的话,其它线程依然可以修改它的状态。请看我另一篇blog,不变模式分析中的例子。
0 请登录后投票
   发表时间:2011-03-14  
不变类也是有状态的,只不过他的状态构建好之后,就不能改变,所以是线程安全的,而不是说不变类是无状态的!这一点我无法认同你的观点!请将无状态类和不变类这两个概念分开。
0 请登录后投票
   发表时间:2011-03-14  
月落码农 写道
不变类也是有状态的,只不过他的状态构建好之后,就不能改变,所以是线程安全的,而不是说不变类是无状态的!这一点我无法认同你的观点!请将无状态类和不变类这两个概念分开。

你是对的。我并没有说不变类就是没有状态的。我是说无状态类是不变类。都没有状态怎么可能变。

引用
无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象.不能保存数据,是不变类,是线程安全的。

我原话是这样的。
0 请登录后投票
   发表时间:2011-03-14  
把状态和线程安全结合起来讲,大家应该更好理解些
0 请登录后投票
   发表时间:2011-03-14  
peterwei 写道
月落码农 写道
不变类也是有状态的,只不过他的状态构建好之后,就不能改变,所以是线程安全的,而不是说不变类是无状态的!这一点我无法认同你的观点!请将无状态类和不变类这两个概念分开。

你是对的。我并没有说不变类就是没有状态的。我是说无状态类是不变类。都没有状态怎么可能变。

引用
无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象.不能保存数据,是不变类,是线程安全的。

我原话是这样的。


不好意思,我前面看错了,对不起哇
0 请登录后投票
   发表时间:2011-03-15  
peterwei 写道
piao_bo_yi 写道
LZ是不是弄混了单例模式?是不是弄混了线程安全与否的概念?而且,状态不就是一个对象的值么?

单例模式与线程安全与否哪里混淆了?你可以说说看。我认为还是你没有认真看,或者说理解得不够深刻。


我又仔细看了下,你说的那些singleton, prototype都是指用Spring负责管理的啊,我把那些和设计模式中的传统意义搞混了。还有线程安全与否,你都是指用Spring来管理对象生成的前提下讨论的。我对SPRING不熟,所以才会误解。把标题改成Spring下的XXX似乎更好。
0 请登录后投票
   发表时间:2011-03-15  
如果楼主能够从内存的角度说说就更好了,方法区,堆,栈了解了,有状态和无状态就没有这样蹩脚了
0 请登录后投票
   发表时间:2011-03-15  
piao_bo_yi 写道
peterwei 写道
piao_bo_yi 写道
LZ是不是弄混了单例模式?是不是弄混了线程安全与否的概念?而且,状态不就是一个对象的值么?

单例模式与线程安全与否哪里混淆了?你可以说说看。我认为还是你没有认真看,或者说理解得不够深刻。


我又仔细看了下,你说的那些singleton, prototype都是指用Spring负责管理的啊,我把那些和设计模式中的传统意义搞混了。还有线程安全与否,你都是指用Spring来管理对象生成的前提下讨论的。我对SPRING不熟,所以才会误解。把标题改成Spring下的XXX似乎更好。

spring和传统设计模式里的单例是一样的。我说的singeton,protyotye同样适用于不用spring的环境。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics