Java 线程安全和共享资源

Java 线程安全和共享资源,java,multithreading,Java,Multithreading,我一直在读,可以由多个线程同时安全调用的代码称为线程安全。如果一段代码是线程安全的,那么它不包含争用条件。仅当多个线程更新共享资源时,才会出现争用条件。因此,了解Java线程在执行时共享的资源非常重要 我的课程如下 public class ClassA { JSONObject data = new JSONObject(); public void methodA(Map<?, ?> resultMap, String Url) { try { da

我一直在读,可以由多个线程同时安全调用的代码称为线程安全。如果一段代码是线程安全的,那么它不包含争用条件。仅当多个线程更新共享资源时,才会出现争用条件。因此,了解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);
    }

}
}
公共类ClassA{
JSONObject数据=新的JSONObject();
公共void方法A(映射结果映射,字符串Url){
试一试{
data.put(“请求id”,resultMap.get(“请求id”);
data.put(“账户”)、resultMap.get(“账户”);
sendToCallBackUrl(数据、Url、结果映射);
}捕获(JSONException e){
错误(e);
}
}
公共void方法B(映射结果映射,字符串Url){
试一试{
data.put(“请求id”,resultMap.get(“请求id”);
data.put(“name”),resultMap.get(“name”);
sendToCallBackUrl(数据、Url、结果映射);
}捕获(JSONException e){
错误(e);
}
}
}
我的问题是关于
JSONObject data=new JSONObject()
的用法,它是否像当前声明的那样是线程安全的

或者我需要在每个方法中声明它吗

所有方法中的数据都传递给另一个类
postToCallBackUrl
和一个特定方法
sendToCallBackUrl(数据、Url、结果映射)


有人建议吗?

这看起来非常不安全。显式声明该类不是线程安全的。由于
数据
可以在不进行任何同步的情况下从方法访问,因此这不是一种安全的用法

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


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

这看起来非常不安全。显式声明该类不是线程安全的。由于
数据
可以在不进行任何同步的情况下从方法访问,因此这不是一种安全的用法

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

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