变量的同步和本地副本

2024-05-04

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

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);
}

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

If返回的对象someGlobalInstance.getMap()总是相同的,那么同步块实际上使用了准全局对象监视器,并且代码产生了预期的结果。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

变量的同步和本地副本 的相关文章

随机推荐