我有一个程序接收需要处理并存储在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个对象中的每一个都包含损坏的数据。这是竞争条件吗?这怎么可能?