java - 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);
}
}
解决方案
该对象本身似乎是线程安全的,因为这些字段都是不可变的。
然而,像 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 已经指出的那样),因为实例不在线程之间共享。
推荐阅读
- jersey-2.0 - 泽西岛不尊重@Produces
- java - SpEL 不解析简单的 ${spring.profiles.active} 表达式
- c++ - 将函数移动到线程时内存泄漏(使用 lambda)
- java - 查找与给定终点、起点和最小圈数匹配的线的程序
- react-native - 如何将导航道具传递给“createStackNavigator”以使用带有动画的默认标题
- ios - AVAudioPlayer 在进行 WebRTC 音频通话时以非常低的音量播放声音
- php - Laravel 数据['title']
- excel - 将数据保存到文本文件
- foreign-keys - 正向工程 EER 图产生错误 1882
- html - 如何通过 pup 从下一行中选择值?