代码之家  ›  专栏  ›  技术社区  ›  ip696

Spring@Service线程中的class字段安全吗?[副本]

  •  1
  • ip696  · 技术社区  · 7 年前
    @Slf4j
    @Service
    public class SendServiceImpl implements SendService {
    
        private final MessageService messageService;
    
        private Message message;
    
        public SendServiceImpl (MessageService messageService) {
            this.messageService = messageService;
        }
    
        @Transactional
        @Override
        public void send(String messageGuid) {
                message = messageService.getOne(messageGuid);
                //...
        }
    

    taskExecutor.execute(() -> sendService .send(someGuid);//5 different guids
    

    message 如果我像类字段一样声明消息?

    有人能详细解释一下吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Raphael Alves    7 年前

    如果一个bean是单例的,那么所有应用程序都有一个实例。因此,当5个线程传递到那里时,每次调用后值都会改变。

    https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html

        2
  •  1
  •   meriton    7 年前

    默认情况下, @Service 指示单个服务对象将为所有请求提供服务。因此,如果在 @服务 ,您必须确保以线程安全的方式访问它。

    这就是为什么可变状态通常不保持不变的原因 @服务 领域。