Spring Boot本地文件列表REST API的线程安全与无状态实现
线程安全的Spring Boot文件浏览API构建问题
我正在编写一个测试用Spring Boot应用,目标是从基础开始构建线程安全版本。这个应用是一个简单的REST API,能根据用户通过GET参数传入的路径,返回应用所在本地Linux文件系统中的文件和目录名称列表。暂不考虑容器/Kubernetes、事件/队列架构等水平扩展方案,运行环境假设为单多核Linux服务器上的JVM。
提供的代码
@RestController public class myController { FileService fileService; /**RestController method to return JSON formatted list of file & directory *names contained within a given path when *http://[server:port]/rest/browse?path=[UserSpecifiedPath] is requested by client**/ @GetMapping("/rest/browse") public List<java.io.File> browseFiles(@RequestParam(value="path",required=false) String pathName) { return fileService.list(pathName); } } @Service public class FileService { //Service method to return alphabetically sorted list of non-hidden files & directories public List<java.io.File> list(String pathName) { return Arrays.asList(Arrays.stream(new File(pathName).listFiles()) .parallel() .filter(file -> !file.getName() .startsWith(".")) .sorted(Comparator.comparing(File::getName)) .toArray(File[]::new)); } }
线程安全疑虑与需求
FileService的list方法通过Arrays集合、lambda表达式处理新File对象,返回排序后的非隐藏文件及目录列表。我担心单例模式的FileService在Spring多线程请求环境下存在线程安全问题:多线程同时执行list方法时,操作过程似乎非原子性,可能导致不可预测结果;即便当前Spring Boot框架处理了该问题,未来添加并发逻辑仍会有隐患。
我不确定上述推理是否正确,想了解如何将FileService改造成无状态的。
编辑说明:根据他人回答,FileService本身是无状态且线程安全的,因为其操作的变量均为局部变量、方法参数或返回值,存储在各自线程的栈中,即便逻辑非原子性也不会影响线程安全。
内容的提问来源于stack exchange,提问作者hut_rudder
相关产品推荐
相关产品推荐

