0

我有一个连接到套接字连接的应用程序,并且该连接向我发送了很多信息.. 可以说每秒 300 个订单(可能更多).. 我有一个类(它就像一个监听器,对某些事件和该事件具有订单)接收该订单..创建一个对象,然后将其添加到一个 ObservableList (这是一个 tableView 的来源).. 这样我的 GUI 显示该订单。但是问题来了,如果 observableList 上已经存在该订单..我无法添加它..我必须更新它(我这样做)..但有时..对于某些订单,这种情况不起作用并再次添加订单。

我将向您展示它是如何与一些代码一起工作的。

 public class ReceivedOrderListener 
 {
     ev = Event; //Supose that this is the event with the order
     if(!Repository.ordersIdMap.containsKey(ev.orderID))
     {    

         Platform.runLater(new Runnable() 
         {
            @Override public void run() 
            {                                                                    
                Repository.ordersCollection.add(ev.orderVo);                        
            }
         } 
      });
      Repository.ordersIdMap.put(ev.orderID, ev.orderVo);
  }

现在好了..这是我的代码的简历。ev 是我的事件,包含订单的所有信息,orderID 是我用来查看订单是否已经存在的键(并且是唯一的)。“Repository”是一个单例类,“ordersCollection”是一个 ObservableList,“ordersIdMap”是一个 HashMap

4

1 回答 1

1

如果ReceivedOrderListener由多个线程执行,那么它看起来像“check-then-act”竞争条件。

-> ORDER1 comes to the listener
T1 checks ordersIdMap.containsKey(ORDER1) it returs false
T1 proceeds to do Platform.runLater to add the order
-> ORDER1 comes to the listener again
-> T2 checks ordersIdMap.containsKey(ORDER1) it returs false again
now T1 proceeds to do ordersIdMap.put(ORDER1)
-> T2 proceeds to do Platform.runLater to add the order again
于 2013-09-05T18:00:42.333 回答