我一直在阅读,可以同时被多个线程安全调用的代码称为线程安全。如果一段代码是线程安全的,则它不包含竞争条件。竞争条件仅在多个线程更新共享资源时发生。因此,重要的是要知道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)
。
有人建议吗?
答案 0 :(得分:3)
这看起来非常线程不安全。 javadoc for JSONObject
明确声明该类不是线程安全的。由于可以从方法中访问data
,而无需进行任何形式的同步,因此这不是安全的用法。
但是对于使用一个线程来说,该代码甚至看起来都不安全,因为来自一个方法调用的状态会影响其他方法的调用。
是的,在方法中创建一个新的JSONObject
作为局部变量。然后,它通过限制变得线程安全,并且在方法调用之间不保留任何状态。