我有一个 Java 类,其中包含一个ArrayList
事务信息对象,这些对象经常被不同的线程查询和修改。在基本层面上,类的结构看起来像这样(目前不存在同步):
class Statistics
{
private List<TranInfo> tranInfoList = new ArrayList<TranInfo>();
// This method runs frequently - every time a transaction comes in.
void add(TranInfo tranInfo)
{
tranInfoList.add(tranInfo);
}
// This method acts like a cleaner and runs occasionally.
void removeBasedOnSomeCondition()
{
// Some code to determine which items to remove
tranInfoList.removeAll(listOfUnwantedTranInfos);
}
// Methods to query stats on the tran info.
// These methods are called frequently.
Stats getStatsBasedOnSomeCondition()
{
// Iterate over the list of tran info
// objects and return some stats
}
Stats getStatsBasedOnSomeOtherCondition()
{
// Iterate over the list of tran info
// objects and return some stats
}
}
我需要确保列表上的读/写操作正确同步,但是,性能非常重要,所以我不想最终锁定每个方法调用(尤其是并发读操作)。我查看了以下解决方案:
CopyOnWriteArrayList
我已经研究了使用CopyOnWriteArrayList来防止在迭代列表时修改列表时引发 ConcurrentModificationExceptions;这里的问题是每次修改列表时所需的副本......考虑到列表的修改频率和列表的潜在大小,这似乎太昂贵了。
读写锁
ReadWriteLock可用于同步读/写操作,同时允许发生并发读操作。虽然这种方法可行,但最终会导致类中出现大量同步代码(但这并不是世界末日)。
有没有其他聪明的方法来实现这种同步而不会造成很大的性能损失,或者上述方法之一是推荐的方法吗?对此的任何建议将不胜感激。