@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
的值?
任何人都可以详细解释吗?
答案 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
字段中的原因。