Spring Boot应用程序和并发问题

Ido*_*ash 5 java concurrency spring spring-boot

我正在开发一个将在带有tomcat的spring boot上下文中运行的应用程序。该项目在启动时连接到Kafka,提取消息并进行处理。tomcat用于某些管理API。

当Spring加载时,它通过多个线程与Kafka连接。每个线程都与处理消息的Spring bean自动连线。当然,该豆与更多豆等自动连接。

我需要考虑并发问题吗?同步东西?使用并发类型,例如ConcurrentHashMap而不是普通的HashMap?

Mav*_*arn 6

在spring中,bean默认是单例的。bean的方法可以被多个线程同时调用。在每种方法中,您不需要关心并发性。但是如果你想将数据保存在其他地方,比如其他数据对象的bean成员,你应该关心这些数据持有者的并发性。

在这个例子中:

@Service
public class SomeService {
   public Map handle(Map dataHolder) {...}
}

@Service
public class OtherSerice {
  @Inject SomeService serv1;
  Map theDataNotSafe = new HashMap();

  public Map func() {
    Map theData = new HashMap();
    serv1.handle(theData); // thread safe, 
    serv1.handle(theDataNotSafe); // not thread safe
  }
}
Run Code Online (Sandbox Code Playgroud)

OtherService.func() 函数将调用SomeService.handle(..). 函数serv1.handle(theDataNotSafe); 不是线程安全的,因为有多个线程会调用相同的函数HashMap