首页 > 解决方案 > MultipartUtility 类的本地实例在 java 中是线程安全的吗?

问题描述

“uploadFile”方法中的MultipartUtility对象实例“multipartUtil”是线程安全的吗?我相信实例地址将存储在堆栈中,对象将存储在堆中。这个 MultipartUtility 类具有类级变量。如果对象实例只能由该特定线程访问,那么所有变量都期望类上的静态变量被认为是线程安全的?

public class MyController {
    public ResponseEntity<String> uploadFile(String stringUrl, MultipartFile multiPartFile) {       
        String charset = "UTF-8";
        String contentType = "multipart/form-data";
        String agent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2";
        
            MultipartUtility multipartUtil = new MultipartUtility(stringUrl, charset); 
            multipartUtil.addHeaderField("User-Agent", agent);
            multipartUtil.addHeaderField("Content-Type", contentType);
            File fileObj = new File(multiPartFile.getOriginalFilename()); 
            multipartUtil.addFilePart("fileUpload", fileObj);
            List<String> response = multipartUtil.finish(); 
            StringBuilder responseStr = new StringBuilder();
            for (String line : response) {
                responseStr.append(line);
            }           
            return new ResponseEntity<String>(responseStr.toString(), HttpStatus.OK);       
    }
}

标签: javathread-safety

解决方案


该对象本身似乎是线程安全的,因为这些字段都是不可变的。

然而,像 writer 和 connection 这样的对象不应该同时使用:

 public void addFormField(String name, String value) {
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append("Content-Disposition: form-data; name=\"" + name + "\"")
                .append(LINE_FEED);
        writer.append("Content-Type: text/plain; charset=" + charset).append(
                LINE_FEED);
        writer.append(LINE_FEED);
        writer.append(value).append(LINE_FEED);
        writer.flush();
    }

如果这将被同时调用,那么编写者最终可能会交错 2 个请求。

根据上面的示例代码,似乎没有并发问题(正如 Unmitigated 已经指出的那样),因为实例不在线程之间共享。


推荐阅读