论坛首页 Java企业应用论坛

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

浏览 27329 次
精华帖 (7) :: 良好帖 (4) :: 新手帖 (5) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-03-15   最后修改:2011-03-15
  你写的类StatefulBean并不是线程不安全的。什么叫线程安全?指的就是不同线程不存在同时访问一个变量,或一个函数的情形。什么样的变量能被多个线程访问呢?JAVA中,类中的静态变量,单例类的任何属性都可以被多个线程访问。所以线程安全与否必须和这些在一起谈才有意义吧?不然,你可以把任何普通类的对象说成是线程不安全的。
另外,不变的对象不代表是线程安全的。不允许重入的函数,如果两个线程同时访问,一个异步的指针移动程序必然崩溃。
  有一些类的方法本来不用属性,却没有声明为static,主要是为了利用多态。所以工具类(纯静态方法),和这种类还是区别开来比较好。
0 请登录后投票
   发表时间:2011-03-15  
piao_bo_yi 写道
  你写的类StatefulBean并不是线程不安全的。什么叫线程安全?指的就是不同线程不存在同时访问一个变量,或一个函数的情形。什么样的变量能被多个线程访问呢?JAVA中,类中的静态变量,单例类的任何属性都可以被多个线程访问。所以线程安全与否必须和这些在一起谈才有意义吧?不然,你可以把任何普通类的对象说成是线程不安全的。
另外,不变的对象不代表是线程安全的。不允许重入的函数,如果两个线程同时访问,一个异步的指针移动程序必然崩溃。

可能你没有仔细看。:->我没说StatefulBean是线程安全的。强不变类就是代表线程安全的,因为不可变,可以看看不变模式中的强不变。
0 请登录后投票
   发表时间:2011-03-16  
我对stateful session bean 一直有点疑惑,就是stateful保持的状态的生存周期是多久? 购物车的例子更让我迷惑。

就拿这个例子来说
ShoppingCartBean :
            List<Product> products
            addItem();
            browse();

我一次addItem,然后browse。这里有两次客服端request。我通过jndi拿到的ShoppingCartBean是否是同一个呢,也就是bean的状态products是request级别还是session级别?

引开来说stateful session bean针对的是一个线程还是用户的会话?
0 请登录后投票
   发表时间:2011-03-16   最后修改:2011-03-16
beforezero 写道
我对stateful session bean 一直有点疑惑,就是stateful保持的状态的生存周期是多久? 购物车的例子更让我迷惑。

就拿这个例子来说
ShoppingCartBean :
            List<Product> products
            addItem();
            browse();

我一次addItem,然后browse。这里有两次客服端request。我通过jndi拿到的ShoppingCartBean是否是同一个呢,也就是bean的状态products是request级别还是session级别?

引开来说stateful session bean针对的是一个线程还是用户的会话?

其实我这篇文章,并不是主要介绍ejb的。 .你说了,就说说。
总体周期是从客户端调用create()到客户端调用remove(),当然会话也有超时,当客户端一段时间没有访问SFSB方法时,EJB容器会将其回收。 SFSB的状态是指其实例变量的值,EJB容器分配一个SFSB实例给客户端使用后将保持该实例只给该客户端使用。

其实,你可以将SFSB的状态理解成HTTP的Session状态。

关于有状态会话BEAN的生命周期:
1:不存在状态---(client调用create())(容器调用Class.newInstance(),setSessionContext(),ejbCreate())---> 进入方法就绪状态(此时可以为client服务)
---> 如果超时则容器将其销毁,回到不存在状态。
---> 如果服务器要节省资源或遇到新事务开启,则释放资源,实例打回到不存在状态。
序列化实例字段。(容器调用ejbPassivate()挂起)---> 事务等结束,重新找会资源,反序列化实例字段。
建立一个新的BEAN实例(容器调用ejbActivate()激活---> 容器调用ejbRemove()或客户显示调用remove()也会将BEAN打回到不存在状态。
0 请登录后投票
   发表时间:2011-03-17  
我认为lz讲得更模糊,而且有些概念混淆了
0 请登录后投票
   发表时间:2011-12-06  
学习了,之前没有注意到这些问题,重新思考一下
0 请登录后投票
论坛首页 Java企业应用版

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