【发布时间】:2012-07-17 13:01:32
【问题描述】:
我实现了一个静态帮助器类,它帮助缓存和检索数据库中的一些只读、非可变、非易失性数据。
(剥离)示例:
public class CacheHelper
{
private static HashMap foos, bars;
public static Foo getFoo(int fooId) { /* etc etc */ }
public static Bar getBar(int barId) { /* etc etc */ }
public static void reloadAllCaches()
{
//This is where I need it to lock access to all the other static methods
}
}
按照我对静态类的阅读方式,如果我将 synchronized 关键字添加到 reloadAllCaches() 方法,这将在该方法执行时对整个类应用锁定。它是否正确? (编辑:是的,不正确。感谢您的回复。)
注意:我希望对 getter 方法的线程安全性和它们返回的对象保持不可知论,因为这些数据永远不会发生变异,并且希望它尽快返回。
【问题讨论】:
-
不能使用 ConcurrentMap 吗?您是否需要一次更新整个地图,或者是否可以更新一些值而一些不更新?
-
它正在清除地图,然后(或多或少)在格式化后将表格的全部内容转储到其中。虽然如果我包含一些逻辑以仅更新实体等,您的建议是可行的,但我宁愿它每次都是一个干净的表转储。
-
您不需要为此锁定。构建全新的地图并将它们分配给
volatile字段。地图本身可以是普通的HashMaps,为了安全起见,可能会包裹在immutableMaps 中。我假设只有一个线程会进行重建。 -
没错,单线程会构建。在重建它们时,我清除了现有地图并重新填充....但是你的建议也很有趣,如果我将它构建为新地图,然后将其分配到旧的易失地图之上,它可能会实现相同的目标。
标签: java multithreading static static-methods