gpt4 book ai didi

java - 线程安全和共享资源

转载 作者:行者123 更新时间:2023-12-01 19:48:46 24 4
gpt4 key购买 nike

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

有人建议吗?

最佳答案

这看起来非常线程不安全。 javadoc for JSONObject明确指出该类不是线程安全的。由于可以从方法中访问数据而无需任何类型的同步,因此这不是安全的用法。

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

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

关于java - 线程安全和共享资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52238498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com