无状态Bean的并发性

时间:2015-02-09 18:59:01

标签: java java-ee concurrency ejb-3.1 glassfish-4

我有两个会话bean:

  • 无状态会话Bean,名为AuctionFrontEnd。
  • 一个名为StateAuctionFrontEnd
  • 的单例会话Bean

在StateAuctionFront中,有一个HashMap以及来自HashMap的put和remove元素的方法。并发由@Lock(WRITE)和@Lock(WRITE)注释处理。

AuctionFrontEnd Bean实现调用StateAuctionFrontEnd中方法的业务逻辑方法。

AuctionFrontAnd中的示例方法是跟随者(伪代码):

public void removeValue(int key){
  if(stateAuctionFronEnd.getHashMap().containsKey(key))
     stateAuctionFronEnd.getHashMap().remove(key);
}

如果有两个客户想要消除相同的元素,则可以触发异常。 两者都调用delete方法,两者都进入'if'。 一个删除元素,另一个启动异常。

我在其他商业方法中遇到同样的问题。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果得到stateAuctionFronEnd.getHashMap(),则保留EJB的锁并同时修改地图。

切换到并发数据结构不会有帮助,因为if语句和delete都在EJB的同步块之外。

您应该将逻辑完全移到Singleton bean并封装对hashmap的访问,如:

@Lock(WRITE)
public void removeValue(int key){
     if(stateAuctionFronEnd.getHashMap().containsKey(key))
          stateAuctionFronEnd.getHashMap().remove(key);
}

或者,您也可以同步被叫代码