Spring @Service 中的类字段线程安全吗?

ip6*_*696 3 java spring multithreading

@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);
            //...
    }
Run Code Online (Sandbox Code Playgroud)

这个类线程安全吗?如果我像这样在 5 个线程中运行会出现什么问题:

taskExecutor.execute(() -> sendService .send(someGuid);//5 different guids
Run Code Online (Sandbox Code Playgroud)

在实践中,我研究了日志文件,发现同一实体使用不同的线程工作。message 我是否正确理解,在这种情况下,如果我像类字段一样声明消息,线程可以更改实体的值?

谁能详细解释一下吗?

mer*_*ike 6

默认情况下,@Service表示单个服务对象将为所有请求提供服务。因此,如果您在 a 的字段中保留可变状态@Service,则必须确保以线程安全的方式访问它。

这就是为什么可变状态通常不保存在@Service字段中的原因。