ThreadPool和损坏的数据

时间:2015-07-24 18:01:36

标签: java concurrency threadpool race-condition

我有一个程序接收需要处理并存储在5个不同对象(MyContainer)中的大量数据。我介绍了ThreadPool,以便同时处理这些对象的数据。这是我的代码:

public class DataReader
{
     ExecutorService pool = Executors.newFixedThreadPool(5);
     public void handleData(Data myData)
     {
         HashMap<MyContainer, List<String>> containerMap = someObj.getMyContainerMap();

         for (MyContainer myContainer : containerMap.keySet())
         {
              List<String> sources = containerMap.get(tContainer);

              for(String s : sources)
              {
                   if(s.equalsIgnoreCase(myData.source))
                   {
                        myContainer.setData(myData);
                        pool.submit(myContainer);
                        break;
                    }
               }    
           }
     }
}

MyContainer对象如下所示:

public class MyContainer implements Runnable
{
    private int containerID;

    private Collection c1;
    private Collection c2;
    private Collection c3;
    private Collection c4;
    private Collection c5;

    private volatile Data dataToProcess;
    public void run()
    {
        addData();
    }

    public void setData(Data data)
    {
         dataToProcess = data;
    }



public void addData()
    {
         if (containerID == someConstantID1)
         {
           processDataForCol1(dataToProcess);
         }
         else if (containerID == someConstantID2)
         {
           processDataForCol2(dataToProcess);
         }        
         else if (containerID == someConstantID3)
         {
            processDataForCol3(dataToProcess);
         }
         else if (containerID == someConstantID4)
         {
            .....so on
         }

    }
}

processDataForColX()方法有自己的处理逻辑,对于5个MyContainer对象中的每一个都不相同。这是一个相当复杂的逻辑,我试图尽可能简化,而不会失去流量。

简而言之,5个MyContainer对象需要处理同一条信息。最初它按顺序完成,一个MyContainer对象正在接收数据,处理,返回,下一个MyContainer对象正在处理相同的数据。现在数据量增加,同时处理是必要的。

我的问题是我用setData()设置的数据搞砸了,5个对象中的每一个都包含损坏的数据。这是竞争条件吗?这怎么可能?

0 个答案:

没有答案