Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
572 views
in Technique[技术] by (71.8m points)

springboot2.x service定义成员变量,每次执行对应的赋值操作,会有线程安全问题么?

spring boot 定义这个私有成员变量,每次请求从controller访问指定的方法

在方法中对成员变量进行赋值操作,随后后续执行都只读改变量,多个请求会对这个成员变量产生安全问题么?

继续补充一波代码演示下

控制器

@RestController
@RequestMapping("/code")
public class AController {

    @Autowired
    private AService aService;

    @RequestMapping("/search")
    public Result<T> search(T dto) throws Exception {
        return this.aService.search(dto);
    }
}

服务

@Service
@Slf4j
public class CServiceImpl extends ServiceImpl implements CService {

    private Group group = null;
    @Autowired
    private GroupService groupService;

    
    public Result search(T dto) {
        // 每次都从数据库取一条数据覆盖该group成员变量
        this.group = this.groupService.getOne(dto.getId());
        // 继续执行下面的逻辑,以下操作都仅限于读取group的值,不会修改,在多个请求并发时,this.group会不会发生线程安全问题呢?
        this.todo1(this.group);
        this.todo2(this.group);
        this.todo3(this.group);
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

默认情况下,控制器为单例,如果 Service是自动装配的,默认情况下,服务也为单例。所以操作要处理成线程安全的才行。至于你说的先赋值,再读取,要看是不是一次性赋值,还是每次都赋值。
很多线程序安全也是也初始化实现成线程不安全的,但初始后的正常运行是线程安全的。具体可能还是要看你的使用场景和代码了。

如果你只在 search 方法里用于了 group,那赋值给成员变量是完全多余的操作,可以直接去掉了。

如果还有少量别的方法也用,以传参的方式实现会更简单。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...