当前位置: 首页 > 面试题库 >

在春季服务类中使用ConcurentHashMap和AtomicInteger作为实例变量

高迪
2023-03-14
问题内容

我试图在注入控制器的单例spring服务中实现ConcurentHashMap的线程安全用法:

@Service
public MyService{

  final ConcurrentMap<String, AtomicInteger> myMap = new ConcurrentHashMap<String,   AtomicInteger>(10) {
        {/* initialize the ten key/values */
        }
    };

 public int add(String key) {
   return myMap.get(key).incrementAndGet();
 }

    // accessed via ajax loop (and controller), if value changes update display
  public int getCount(String key) {
    return myMap.get(key).get();
  }
}

有没有更好的方法可以使哈希映射成为线程安全的?我如何才能使其适应集群环境?这是我的另一个问题。


问题答案:

我的目的不是要回答这个问题,特别是。因为我没有多方面的专业知识;但是,我想指出我认为值得注意的地方。

@JB Nizet在评论之一中提到该代码是 线程安全的正确的 。我想根据Java
API参考
添加但
不一致


检索操作(包括获取)通常不会阻塞,因此可能与更新操作(包括放置和删除)重叠

这意味着 当前正在 运行某些更新时,可能会有一个客户端获取此信息。而且,这很有意义,因为您在代码中提到了“循环”。因此,如果这对您而言 并不
重要,那么一切都应该很好。

但是,如果您需要对此进行更严格的规定,我在想也许使用的实例ReentrantReadWriteLock将是一个不错的选择。该锁使您的代码可以阻止所有读取请求,直到对可用信息有
一致的 快照为止。您可能会使用getCount方法上的锁来严格阻止,直到add方法释放所有锁,以等待代码中使用的映射的一致快照为止。

我也有一个猜测,当您将其迁移到集群解决方案时,同样的担忧是有效的。如果需要在不同群集节点之间 保持一致性 ,则应注意这一点。



 类似资料:
  • 问题内容: 我正在设计一个基于JPA / Hibernate,Spring和Wicket的新应用。我对DAO和Service层之间的区别还不清楚。根据维基百科,DAO是 一个为某种类型的数据库或持久性机制提供抽象接口的对象,提供某些特定的操作而不公开数据库的详细信息。 我想知道DAO是否可以包含与数据访问无关的方法,但是使用查询执行起来会更容易吗?例如,“获取在一组特定机场上运营的所有航空公司的列

  • 问题内容: 我如何让Spring从中加载Hibernate的属性? 我们正在使用Spring和JPA(以Hibernate作为实现)。Spring 指定了JPA语言和Hibernate属性: 在这种配置中,Spring通过applicationContext.xml读取所有的Hibernate属性。当我创建一个(位于我的类路径的根目录,与META- INF处于同一级别)时,Hibernate根本不

  • 问题内容: 我有一个非常简单的抽象类 现在您可以看到,我正在尝试自动连接DatabaseModel。但是在我的扩展类中,我只为dbModel接收null。 问题:我在这里尝试一些不可能的事情吗? 问题答案: 您的设置似乎很好。原因也许在其他地方。也许您正在使用实例化该类,而不是让spring这样做。

  • 问题内容: 我们计划使用Spring 4.0.6版本制作一个新应用程序。我们使用可以返回“ XML”或“ JSON”的控制器。在上一个项目中,我们已经使用JAX-RS API成功地将Spring的Jersey支持REST支持,但是在阅读了前辈的几篇文章和建议后,他们说Spring提供了很好的REST支持。 如果我不使用JAX-RS和Jersey而使用Spring REST支持,则使我真正感到困惑的

  • 问题内容: 只需要您对Spring声明式事务管理的专家意见。这是我的设置: DAO层是使用Spring JdbcTemplate的普通JDBC(没有Hibernate等) 服务层是具有声明式事务的POJO,如下所示- 通过上述设置,一切正常。但是,当我说时,我在日志文件中看到错误消息。对于服务层中的所有get *方法,都会发生这种情况。 现在我的问题是: 答:我必须设置为只读吗?我所有的方法都是纯

  • 这个例子的目的是向您展示如何构建一个预装Riak的docker镜象。 创建Dockerfile 创建一个空文件Dockerfile $ touch Dockerfile 接下来,定义你想要来建立你镜像的父镜像。我们将使用Ubuntu(tag:最新版),从Docker Hub中下载: # Riak # # VERSION 0.1.0 # Use the Ubuntu base ima