enum和ConcurrentHashMap上的Java单例。线程安全问题?
我希望将临时被阻止的用户保留在位于singleton中的HashMap中: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
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());
}