java - 创建新对象是否有助于防止静态方法中的并发问题?
问题描述
我有这个接受的方法OkHttp#response
:
public static Map<String, Object> getResponseBody(Response response) throws IOException {
return new ObjectMapper()
.readValue(response.body().string(),
new TypeReference<Map<String, Object>>() {
});
}
据我了解,如果多个类getResponseBody
使用Response
.
如果我这样做会解决吗?:
public static Map<String, Object> getResponseBody(Response response) throws IOException {
ResponseBody responseBody = response.body();
String responseString = responseBody.string();
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = mapper
.readValue(responseString,
new TypeReference<Map<String, Object>>() {
});
return map;
}
解决方案
正如评论中提到的,
tl;dr:我提供的第一个代码一直是线程安全的。
每个调用 getResponseBody 方法的线程都会提供一个线程本地的 Response 实例。这里没有需要同步的共享静态资源。它看起来是线程安全的。
对于非静态和静态方法,局部变量不在线程之间共享。他们引用的可能是。
第二种方法与第一种方法做同样的事情,但对某些值使用命名变量。它不会改变它的行为。
推荐阅读
- javascript - 如何在登录页面上添加 Android 和 iOS 设备图像
- android - 当 setHasFixedSize(true) 时,Firebase recyclerview 不显示任何内容
- vue.js - 当你不能使用计算属性时,什么是一个好的 vue.js 设计模式可以避免直接改变 props
- ibeacon - iOS CLRegion 监控在一天后停止工作
- java - Gradle build 找不到方法 ResponseEntity.of(object)
- php - 使用构造函数创建 DateTime 更改时间
- javascript - rerender 删除 React 中的数据
- vb.net - 如何在 vb.net 中使用已知凭据(IP、用户名和密码)连接远程 PC
- python - sql-alchemy 关系/ backref - 将两个“用户”链接到一个“消息”会引发错误
- fltk - msys2 gcc: hello.cxx 致命错误: FL/Fl.H: 没有这样的文件或目录