java对threadsafe函数的调用也需要同步吗?
如果我使用ConcurrentHashMap(put是线程安全的),并且我提供了一个使用ConcurrentHashMap put的公共函数myPut,那么我需要同步我的函数吗
意思:这应该同步吗
ConcurrentHashMap map;
public void myPut(int something) {
this.map.put(something);
}
你可以在下面搜索框中键入要查询的问题!
如果我使用ConcurrentHashMap(put是线程安全的),并且我提供了一个使用ConcurrentHashMap put的公共函数myPut,那么我需要同步我的函数吗
意思:这应该同步吗
ConcurrentHashMap map;
public void myPut(int something) {
this.map.put(something);
}
# 1 楼答案
否。
您可以一次多次校准myPut
put将一次调用一个,因为哈希表的访问需要一次调用一个。(另请参见共享内存中的并发写入)
# 2 楼答案
视情况而定
当您为将从多个线程使用的对象编写类时,整个游戏都会发生变化。如果希望提供任何线程安全保证,您需要了解您试图实现的结果
在这种情况下,如果这是类中唯一的方法,那么同步对此方法的访问就没有意义了。但它不是唯一的方法,因为它会使类变得毫无意义
仅当出于其他原因需要同步此方法以使类线程安全时,才需要同步此方法-此时,您可能想询问
ConcurrentHashMap
的开销是否值得# 3 楼答案
因为
map
引用没有声明final
,所以它可能会被更改。因此,这里有一个潜在的线程错误如果}和泛型
map
应该是一个可变引用,那么您需要做更多的工作。否则使用final
。事实上,尽可能地使用final
,即使“更容易”不使用。“final
是新[旧]private
。”您可能也希望使map
{# 4 楼答案
如果您使用ConcurrentHashMap,您不应该同步“put”,但这并不意味着您的“put”将一次调用一个。这取决于映射的并发级别
所以你必须知道你想要什么
顺便说一句,看看ConcurrentHashTable Javadoc,一切都解释得很好
-帕特里克
# 5 楼答案
ConcurrentHashMap等并发实用程序的设计不需要同步:它们将在内部处理线程安全访问
Tom说的是真的,你需要考虑地图引用改变的潜力。如果引用实际上没有改变,那么在实践中,您可以在这里摆脱它:ConcurrentHashMap的内部同步——实际上还有java。util。一般来说,concurrentlibrary——保证放入映射的对象安全地发布到其他线程。但我同意,即使如此,确定引用是否可以更改,然后在代码中明确说明这一点是一种良好的做法(“如果不能更改,则为final”;如果可以,则为“volatile”或原子引用)