2015-02-09 24 views
0

我有两个会话bean:并发关于无国籍豆

  • 无状态会话bean称为AuctionFrontEnd。
  • 一个单独的会话Bean称为StateAuctionFrontEnd

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

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

在AuctionFrontAnd的实例方法是跟随者(伪代码):

如果还有谁想要消除同一元素两个客户,一个异常可以触发。 两者都调用删除方法,并且都进来'如果'。 一个删除元素,另一个启动一个异常。

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

我该如何解决这个问题?

+1

使用并发数据结构? – Brendan 2015-02-09 19:03:12

回答

1

如果您获得stateAuctionFronEnd.getHashMap(),则离开EJB的锁定并同时修改地图。

切换到并发数据结构将无济于事,因为if语句和delete都不在EJB的同步块之外。

你应该完全移动逻辑来辛格尔顿豆和封装访问到HashMap中,如:

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

另外,您也可以同步称为码

+0

但请记住,当您使用手动同步时,应在单例类中使用'@ConcurrencyManagement(BEAN)'类型。 – slwk 2015-02-10 10:57:39

+0

这是一个解决方案!否则,如果我使用事务API来确保一系列操作的原子性? – 2015-02-10 12:00:02

+0

@slwk是的,但我的意思是无状态bean中的手动同步。 使用事务应该工作并且会陷入“手动同步”类别,但要小心不要长时间锁定 – 2015-02-10 17:27:39