当前位置: 首页 > 面试题库 >

Java中不是CuncurrentSkipListMap的线程安全方法

颜实
2023-03-14
问题内容

在我的Java项目中,我需要以多种方式使用TreeMap。我发现ConcurrentSkipListMap是我需要的,但是某些方法不是线程安全的。其中之一-
containsKey(Object
key)。以多种方式使用此方法的典型解决方案是什么?在我的程序中,我需要放置不会替换旧密钥的密钥,如果不可能的话,我将放置另一个密钥而不会获得唯一密钥。因为我不会丢失信息,所以应该使用哪种构造来代替containsKey?


问题答案:

如果您担心containsKey结果会过时,然后再对它们采取行动,或者担心javadoc中的此警告:

此外,不能保证批量操作putAll,equals,toArray,containsValue和clear是原子执行的。例如,与putAll操作同时运行的迭代器可能只查看一些添加的元素。

在ConcurrentSkipListMap上定义了一些方法,您可以改用这些方法。例如,请参见
putIfAbsent:

如果指定的键尚未与值关联,则将其与给定的值关联。这相当于

if (!map.containsKey(key))
    return map.put(key, value);
else
    return map.get(key);

除了动作是原子执行的。

另请参阅删除和替换方法。



 类似资料:
  • 问题内容: 我有多个线程试图更新MySQL数据库?使用executeUpdate方法是线程安全的吗? 问题答案: 不,使用它不是线程安全的。 实际上,如果其他某个线程使用一条语句,然后另一个线程调用executeUpdate(),则另一个线程的s(如果有的话)将被关闭。“ javadoc.sql.Statement的JavaDoc(PreparedStatement是其子类型) ”如果存在打开的语

  • 我找到了关于线程安全的代码,但它没有来自给出示例的人的任何解释。我想知道为什么如果我不在“count”之前设置“synchronized”变量,那么count值将是非原子的(总是=200是期望的结果)。谢谢

  • 问题内容: 我知道文档说明该对象是线程安全的,但这是否意味着从所有方法对其进行的所有访问都是线程安全的?因此,如果我一次从多个线程中调用它,并且一次在同一实例上调用它,会不会发生什么不好的事情? 问题答案: 快速答案是肯定的,它们是线程安全的。但是不要让它在那里… 首先,一个小的内部管理是一个接口,任何不是线程安全的实现都将破坏书面合同。您包括的链接是指,它具有一定的灵巧性。 您包含的链接引起了一

  • 看起来它工作得很好,但我想知道我是否必须确保新代码需要线程安全?这里有什么意见吗?抱歉用了假名字,提前致谢。

  • IBM的支持指出,Class.GetAnnotation的实现不是线程安全的。 与其他JVM实现(例如,OpenJDK)相比,我们可以看到它们以线程安全的方式实现类方法。IBM JVM是一个闭源JVM,他们确实会发布一些源代码和他们的JVM一起,但无论什么时候他们的类实现是否线程安全,都不足以做出明确的判断。 类文档没有清楚地说明它的方法何时是线程安全的。那么,将类方法(特别是getAnnotat

  • 问题内容: 我对使用感兴趣。我在阅读文档时看到一行内容,即如果没有外部同步,扫描程序对于多线程使用来说是不安全的。我是否可以确认这意味着在两个单独的文件上运行的两个单独的线程中的两个单独的Scanner对象可能会相互干扰? 谁能帮助我从外部同步扫描器对象以用于安全的线程操作? 问题答案: 如果您在两个线程中使用同一Scanner实例,则除非同步对对象的访问,否则将遇到麻烦。但是,两个单独的Scan