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

时间:2019-02-14 12:16:11

标签: 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);
            //...
    }

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

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

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

任何人都可以详细解释吗?

2 个答案:

答案 0 :(得分:2)

否,默认情况下,@ Service的范围是Singleton。因此它不是线程安全的。

如果bean是Singleton,则所有应用程序都有一个实例。因此,当5个线程通过那里时,该值将在每次调用后更改。

您应该尝试查看https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html中的弹簧作用域

答案 1 :(得分:1)

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

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