无状态 Bean 的并发
Concurrency on Stateless Bean
我有两个会话 bean:
- 一个名为 AuctionFrontEnd 的无状态会话 Bean。
- 一个名为 StateAuctionFrontEnd 的单例会话 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);
}
或者你也可以同步被调用的代码
我有两个会话 bean:
- 一个名为 AuctionFrontEnd 的无状态会话 Bean。
- 一个名为 StateAuctionFrontEnd 的单例会话 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);
}
或者你也可以同步被调用的代码