我使用HashMap<String, Group>
来存储用户列表及其可以使用的权限,我知道有些情况下需要从另一个线程访问此HashMap
同样适用于在调用List<String>
时Group对象返回的getPermissions()
。
我从来没有真正理解并发性,所以我问我如何确保方法调用是线程安全的。我查看了使用synchronized关键字的ConcurrentHashMap和Java文档/教程。
public List<String> getPermissions() {
synchronized(this) {
return permissions;
}
}
这是访问附加到我的群组的权限的适当方式还是有更好的方法?值得注意的是,此列表 会添加和删除项目。
另外,如果我使用ConcurrentHashMap
,我认为我不需要使用synchronized关键字吗?谢谢你的帮助。
修改 我可能以一种让人们对名单相关性感到困惑的方式撰写这个问题。在某些时候,查询HashMap以检索Group对象,稍后在Group对象上调用getPermissions。如果一个组不存在,那么我的代码尝试使用默认设置创建它,将对象放入HashMap然后返回原始对象,我应该从HashMap返回它吗?
答案 0 :(得分:2)
使用synchronized
或ConcurrentHashMap
答案 1 :(得分:1)
我个人建议使用CopyOnWriteArrayList(),因为它比ConcurrentHashMap快一点。
ArrayList的线程安全变体,其中通过创建基础数组的新副本来实现所有可变操作(添加,设置等)。
内存一致性效果:与其他并发集合一样,在将对象放入CopyOnWriteArrayList 之前发生在之前的操作中的操作是在从该元素访问或删除该元素之后的操作另一个帖子中的CopyOnWriteArrayList。