【发布时间】:2014-09-11 15:51:38
【问题描述】:
我正在使用 JDK 7、SQLite,并在我的项目中使用 Guava。
我有一个少于 100 个条目的 TreeMap,它由单个“工作”线程每秒更新数百次。我现在正在编写一个组件(另一个线程 - “DB 线程”),它将每隔 5 或 10 秒将地图写入我的数据库。
我知道我需要制作地图的深层副本,以便 DB 线程使用快照,而工作线程继续其工作。我正在查看Guava Maps class,它有许多制作副本的方法,但我不确定它们是否满足我在需要副本时在地图上同步的需求。有没有一种方法可以满足我的需求,或者我应该写一个同步块来制作我自己的深拷贝?
【问题讨论】:
-
你需要一个同步块。并且工作线程也必须在同一个锁上同步。
-
除非您可以修改工作线程以兑现某种锁(在您制作副本时将它们排除在外),否则这是行不通的。但是工作线程肯定已经内置了某种锁定机制,所以您需要做的就是将它也用于复制。
-
没有 Guava
Maps方法做类似的事情。 David Limkys 的回答是正确的。实际上,如果你想从其他线程中使用它而不同步,你无论如何都需要一些ConcurrentMap。关于数据库线程,您可以做其他事情:要求工作线程创建快照并将其发送到数据库线程。但这肯定比使用ConcurrentSkipListMap更复杂,这肯定足够好了。 -
@biziclop - 目前没有使用同步,因为只有一个工作线程在循环中更新地图。