线程安全和共享资源

时间:2018-09-08 19:03:03

标签: java multithreading

我一直在阅读,可以同时被多个线程安全调用的代码称为线程安全。如果一段代码是线程安全的,则它不包含竞争条件。竞争条件仅在多个线程更新共享资源时发生。因此,重要的是要知道Java线程在执行时共享哪些资源。

我有一个如下的课程;

public class ClassA {

JSONObject data = new JSONObject();

public void methodA(Map<?, ?> resultMap, String Url) {

    try {
        data.put("request_id", resultMap.get("request_id"));
        data.put("account", resultMap.get("account"));

        postToCallBackUrl.sendToCallBackUrl(data, Url, resultMap);

    } catch (JSONException e) {

        logger.error(e);
    }

}

public void methodB(Map<?, ?> resultMap, String Url) {

    try {
        data.put("request_id", resultMap.get("request_id"));
        data.put("name", resultMap.get("name"));

        postToCallBackUrl.sendToCallBackUrl(data, Url, resultMap);

    } catch (JSONException e) {

        logger.error(e);
    }

}
}

我的问题是关于JSONObject data = new JSONObject()的用法,是否如当前声明的那样是线程安全的?

还是我需要在每种方法中声明它?

所有方法中的数据都传递给另一个类postToCallBackUrl和特定方法sendToCallBackUrl(data, Url, resultMap)

有人建议吗?

1 个答案:

答案 0 :(得分:3)

这看起来非常线程不安全。 javadoc for JSONObject明确声明该类不是线程安全的。由于可以从方法中访问data,而无需进行任何形式的同步,因此这不是安全的用法。

但是对于使用一个线程来说,该代码甚至看起来都不安全,因为来自一个方法调用的状态会影响其他方法的调用。

是的,在方法中创建一个新的JSONObject作为局部变量。然后,它通过限制变得线程安全,并且在方法调用之间不保留任何状态。