gpt4 book ai didi

java - 变量的同步和本地副本

转载 作者:搜寻专家 更新时间:2023-10-30 19:56:05 27 4
gpt4 key购买 nike

我正在查看一些具有以下习语的遗留代码:

Map<String, Boolean> myMap = someGlobalInstance.getMap();
synchronized (myMap) {
item = myMap.get(myKey);
}

我从 Intelli-J 的代码检查中得到的警告是:

Synchronization on local variable 'myMap'

这是合适的同步吗?为什么?

Map<String, Boolean> myMap = someGlobalInstance.getMap();
synchronized (someGlobalInstance.getMap()) {
item = myMap.get(myKey);
}

最佳答案

这被标记为问题的原因是因为同步局部变量通常不是一个好主意。

如果 someGlobalInstance.getMap() 返回的对象始终相同,则同步块(synchronized block)实际上使用准全局对象监视器并且代码生成预期的结果。

我也同意使用同步包装器的建议,如果你只需要同步 get()/put() 调用并且没有任何更大的同步块(synchronized block)。但是请确保 map 只能通过包装器访问,否则您将有另一次出现错误的机会。

另请注意,如果 someGlobalInstance.getMap() not 始终返回相同的对象,那么即使您的第二个代码示例也无法正常工作,它甚至可能比您的原始代码更糟糕,因为您可以在与调用 get() 的对象不同的对象上进行同步。

关于java - 变量的同步和本地副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1670646/

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