有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java对threadsafe函数的调用也需要同步吗?

如果我使用ConcurrentHashMap(put是线程安全的),并且我提供了一个使用ConcurrentHashMap put的公共函数myPut,那么我需要同步我的函数吗

意思:这应该同步吗

ConcurrentHashMap map;  
public void myPut(int something) {  
   this.map.put(something);  
}

共 (5) 个答案

  1. # 1 楼答案

    否。
    您可以一次多次校准myPut
    put将一次调用一个,因为哈希表的访问需要一次调用一个。(另请参见共享内存中的并发写入)

  2. # 2 楼答案

    视情况而定

    当您为将从多个线程使用的对象编写类时,整个游戏都会发生变化。如果希望提供任何线程安全保证,您需要了解您试图实现的结果

    在这种情况下,如果这是类中唯一的方法,那么同步对此方法的访问就没有意义了。但它不是唯一的方法,因为它会使类变得毫无意义

    仅当出于其他原因需要同步此方法以使类线程安全时,才需要同步此方法-此时,您可能想询问ConcurrentHashMap的开销是否值得

  3. # 3 楼答案

    因为map引用没有声明final,所以它可能会被更改。因此,这里有一个潜在的线程错误

    如果map应该是一个可变引用,那么您需要做更多的工作。否则使用final。事实上,尽可能地使用final,即使“更容易”不使用。“final是新[旧]private。”您可能也希望使map{}和泛型

  4. # 4 楼答案

    如果您使用ConcurrentHashMap,您不应该同步“put”,但这并不意味着您的“put”将一次调用一个。这取决于映射的并发级别

    所以你必须知道你想要什么

    顺便说一句,看看ConcurrentHashTable Javadoc,一切都解释得很好

    -帕特里克

  5. # 5 楼答案

    ConcurrentHashMap等并发实用程序的设计不需要同步:它们将在内部处理线程安全访问

    Tom说的是真的,你需要考虑地图引用改变的潜力。如果引用实际上没有改变,那么在实践中,您可以在这里摆脱它:ConcurrentHashMap的内部同步——实际上还有java。util。一般来说,concurrentlibrary——保证放入映射的对象安全地发布到其他线程。但我同意,即使如此,确定引用是否可以更改,然后在代码中明确说明这一点是一种良好的做法(“如果不能更改,则为final”;如果可以,则为“volatile”或原子引用)