MultipartUtility class 的本地实例在 java 中是线程安全的吗?
Local instance of the MultipartUtility class is thread safe in java?
MultipartUtility“uploadFile”方法中的对象实例“multipartUtil”是否线程安全?我相信实例地址将存储在堆栈中,对象将存储在堆中。此 MultipartUtility class 具有 class 级变量。如果对象实例只能由该特定线程访问,那么 class 上的所有变量期望静态变量是否被认为是线程安全的?
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 已经指出的那样),因为实例不在线程之间共享。
MultipartUtility“uploadFile”方法中的对象实例“multipartUtil”是否线程安全?我相信实例地址将存储在堆栈中,对象将存储在堆中。此 MultipartUtility class 具有 class 级变量。如果对象实例只能由该特定线程访问,那么 class 上的所有变量期望静态变量是否被认为是线程安全的?
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 已经指出的那样),因为实例不在线程之间共享。