session bean不支持并发访问。
entity bean是共享组件,但是,缺省情况下,EJB禁止对bean实例的并发访问。
总之,EJB禁止线程同步。
建议查看《Enterprise JavaBeans》(O'REILLY出版)67页

解决方案 »

  1.   

    如果b是sessionful的那么a1,a2,a3....对b的访问是独立的.
    它们将拥有自己的b.
    如果b是sessionless那么a1,a2,a3.....将共享B.
    但不是a1改变了b的某个属性的值p,a2查询b的p属性的值的时候,就是a1的p属性的值.     
      

  2.   

    to nintyuui:
    你的意思是不是sessionless bean的成员变量会被容器自动恢复?
      

  3.   

    共享是对应于EJB Object来说的,而不是Bean的实例。一个Bean的实例某一时刻只能为一个EJB Object服务。当然除了Stateful,Bean的实例可能在EJB Object之间交换。但这不是共享,Container负责Bean的实例的正确状态,这也就是说Bean实例的交换是不交换状态的。
    除了Entity Bean,无论客户端,还是一个EJB使用另一个EJB的唯一方法是用home.create()创建一个,同时这会在Contianer中创建一个对应的EJB Object。这是因为Stateful整个生命中期只为一个客户服务,而Stateless和Message-Driven是无状态的,不需要共享。
    只有Entity Bean代表持续性数据,是需要共享的,那它的EJB Object是怎样被共享的呢?a1通过create(id)创建了一个Entity Bean,得到一个EJB Object的引用,a2执行findByPrimaryKey(id),Container会返回同一个EJB Object的引用,这样a1,a2共享同一个EJB Object。而共享的效果是和Container实现的事务隔离层有关的。默认是独占访问的。