Java 并发性、哈希映射和列表

Java 并发性、哈希映射和列表,java,Java,我正在使用HashMap来存储用户列表以及他们可以使用的权限,我知道在某些情况下需要从另一个线程访问此HashMap,调用getPermissions()时组对象返回的list也是如此 我从来没有真正正确地讨论过并发性,所以我想知道如何确保方法调用是线程安全的。我已经阅读了ConcurrentHashMap和Java文档/教程,了解如何使用synchronized关键字 public List<String> getPermissions() { synchronized(t

我正在使用
HashMap
来存储用户列表以及他们可以使用的权限,我知道在某些情况下需要从另一个线程访问此
HashMap
,调用
getPermissions()
时组对象返回的
list
也是如此

我从来没有真正正确地讨论过并发性,所以我想知道如何确保方法调用是线程安全的。我已经阅读了ConcurrentHashMap和Java文档/教程,了解如何使用synchronized关键字

public List<String> getPermissions() {
    synchronized(this) {
        return permissions;
    }
}
public List getPermissions(){
已同步(此){
返回权限;
}
}
这是访问附加到我的组的权限的适当方法还是有更好的方法?值得注意的是,此列表将添加和删除项目

另外,如果我使用了
ConcurrentHashMap
我是否正确地假设我不需要使用synchronized关键字?谢谢你的帮助

编辑:
我写这个问题的方式可能会让人们对列表的相关性感到困惑。在某个时候,查询HashMap以检索组对象,然后对组对象调用getPermissions。如果组不存在,则我的代码尝试使用默认设置创建它,将对象放入HashMap,然后返回原始对象,我应该直接从HashMap返回它吗?

或者使用
同步
或者
ConcurrentHashMap
我个人建议使用,因为它比ConcurrentHashMap快一点

  • ArrayList的一种线程安全变体,其中所有可变操作(添加、设置等)都是通过创建基础数组的新副本来实现的

  • 内存一致性影响:与其他并发集合一样,在将对象放入CopyOnWriteArrayList之前,线程中的操作发生在另一个线程中从CopyOnWriteArrayList中访问或移除该元素之后的操作之前


返回列表的副本,而不是原件-避免并发问题,并防止客户端意外修改您的
权限
@AlanStokes请原谅我提出的这样一个问题;这不也会阻止我直接更新列表吗?我仍然需要能够添加和删除列表中的项目。请使用。这就是它的用途。谢谢@EddieB,在我的列表中使用它。将使用ConcurrentHashMap作为HashMap。适合您自己。。。但是
ArrayList
并不完全是
HashMap
对吗?如果你告诉我可以使用字符串作为索引,我今天肯定会学到一些新东西。这是另一个主题。使用字符串作为索引很少是个好主意。原语或它们的盒装包装更好。。。最好是int或long。
CopyOnWriteArrayList
是一个列表。。不是您声称的列表?@Albion Yes,
CopyOnWriteArrayList(collection感谢您回答HashMap位。