我有两个会话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'。 一个删除元素,另一个启动异常。
我在其他商业方法中遇到同样的问题。
我该如何解决这个问题?
答案 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);
}
或者,您也可以同步被叫代码