无状态 Bean 的并发

Concurrency on Stateless Bean

我有两个会话 bean:

在StateAuctionFrontAnd 中有一个HashMap 和从HashMap 中放置和删除元素的方法。并发由@Lock(WRITE) 和@Lock(WRITE) 注释处理。

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

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

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

如果有两个客户端要消除同一个元素,可以触发异常。 都调用了删除方法,都进来了'if'。 一个删除元素,另一个启动异常。

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

我该如何解决这个问题?

如果您得到 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);
}

或者你也可以同步被调用的代码