首页 > 解决方案 > 创建新对象是否有助于防止静态方法中的并发问题?

问题描述

我有这个接受的方法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;
}

标签: javaconcurrencystatic

解决方案


正如评论中提到的,

tl;dr:我提供的第一个代码一直是线程安全的。

每个调用 getResponseBody 方法的线程都会提供一个线程本地的 Response 实例。这里没有需要同步的共享静态资源。它看起来是线程安全的。

对于非静态和静态方法,局部变量不在线程之间共享。他们引用的可能是。

第二种方法与第一种方法做同样的事情,但对某些值使用命名变量。它不会改变它的行为。


推荐阅读