【发布时间】:2012-07-13 09:50:15
【问题描述】:
我有一个 Singleton 类处理一种缓存,其中包含 Hashmap 中的不同对象。 (键的格式直接与存储在映射中的对象类型相关联 - 因此映射属于 )
地图上可能有三种不同的操作:添加、获取、删除。
我通过使用公共入口点方法(无密集访问)来保护对地图的访问:
public synchronized Object doAction(String actionType, String key, Object data){
Object myObj = null;
if (actionType.equalsIgnorecase("ADD"){
addDataToMyMap(key,data);
} else if (actionType.equalsIgnorecase("GET"){
myObj = getDataFromMyMap(key);
} else if (actionType.equalsIgnorecase("REM"){
removeDataFromMyMap(key);
}
return myObj;
}
注意事项:
地图是私人的。方法 addDataToMyMap()、getDataFromMyMap() 和 removeDataFromMyMap() 是私有的。只有入口点方法是公共的,除了类本身的静态 getInstance() 之外别无其他。
您是否确认并发访问地图是线程安全的,因为除了通过该方法之外没有其他方法可以使用地图吗?
如果它对 Map 来说是安全的,我想这个原则可以应用于任何其他类型的共享资源。
非常感谢您的回答。
大卫
【问题讨论】:
-
我假设您的意思是 doAction 是一种同步方法? (它不在你的 sn-p 中。)
-
你有
synchronized3 个方法的关键字吗:addDataIn... 等? -
确实 - 已更正。其他方法是私有的,它们本身并不直接同步
-
这意味着您的线程一次只能添加、获取或删除一个线程,这不是我要说的最佳解决方案。
-
我认为让缓存方法不同步并让入口点同步不是一个好主意,因为如果你只能执行一个操作
标签: java multithreading concurrency thread-safety shared-resource