enum和ConcurrentHashMap上的Java单例。线程安全问题?

enum和ConcurrentHashMap上的Java单例。线程安全问题?,java,concurrency,enums,singleton,Java,Concurrency,Enums,Singleton,我希望将临时被阻止的用户保留在位于singleton中的HashMap中: public enum BlockedUsersRepository { REPOSITORY; private final ConcurrentMap<String, User> blockedUsers = new ConcurrentHashMap<String, User>(); /* Static 'instance' method */ publi

我希望将临时被阻止的用户保留在位于singleton中的HashMap中:

public enum BlockedUsersRepository {

    REPOSITORY;

    private final ConcurrentMap<String, User> blockedUsers = new ConcurrentHashMap<String, User>();

    /* Static 'instance' method */
    public static BlockedUsersRepository getInstance( ) {
            return REPOSITORY;
    }}

问题是:我是否采取了足够的螺纹安全措施?我如何在终端中建立对映射的并发访问模型,以确保它真正工作或失败?这是一种合适的方法吗?因为我担心这是站不住脚的,因为单音起着一种全局变量的作用,可以被许多用户实例访问/修改。我不熟悉Java中的并发性,请您宽容一点。谢谢。

enum as singleton是一种线程安全的创建方法。ConcurrentMap上有
final
,这意味着此时没有问题

并发写入不能破坏ConcurrentHashMap

并发addBlockedUser/removeBlockedUser可能导致用户被阻止或取消阻止。但在我看来,这两个结果都是可以的,因为你没有一个约束条件说用户必须被阻止至少x秒才能被取消

可能存在但不是直接线程化问题的问题

  • 您是否确保电子邮件是唯一的?如果不是,则只能同时阻止其中一个用户
  • 您是否确保电子邮件不为空?ConcurrentHashMap无法处理该情况,并且会违反唯一性
  • 你如何处理某人更改电子邮件的情况

我最关心的是线程安全,其余的则没有那么重要,因为这只是一个教育项目。非常感谢您的支持。
    public void addBlockedUser(User user) {
            blockedUsers.put(user.getEmail(),user);
    }

    public void removeBlockedUser(User user) {
            blockedUsers.remove(user.getEmail());
    }