- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道字典在 python 中是原子的,但是(如果我错了请纠正我)这意味着一次只能完成对字典的一个添加。根据 concurrentHashMap 的 Java 页面:“该表在内部进行了分区,以尝试允许指定数量的并发更新而不会发生争用。” python 中的原子插入不会在速度上无法与 Java 实现相提并论
编辑:当我写道“这意味着一次只能完成对字典的一次添加”时,我的意思是说字典的状态将根据单个字典添加进行离散化
最佳答案
在 Python 中,由于全局解释器锁 (GIL),一个进程无论有多少个线程,一次只能执行一个 Python 字节码。这意味着插入/更新/读取字典的键是线程安全的,这就是人们通常所说的字典的 get/put 是“原子的”。†
但这意味着,正如您所怀疑的那样,尝试将不同键更新到同一字典的多个线程不会并发。当然,Java 没有 GIL 问题,因此多个线程可以同时更新 ConcurrentHashMap 中的不同键。这并不总是发生;这是可能的。 ConcurrentHashMap 实现对键集进行分片并锁定每个分片。每个分片可以并发读取,但一次只能有一个线程写入。
†:有时指出用 Python 编写的具有 __hash__
方法的对象将需要多个 Python 字节码,因此 put 和 get 本身不是原子的;然而简单的 put 和 get 仍然是线程安全的,因为它们不会导致崩溃或垃圾值,尽管您仍然可以有竞争条件。
关于java - Python 等同于 Java 中的 concurrentHashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48124257/
判断这2个相似的Uris实际上相同的标准方法是什么? var a = new Uri("http://sample.com/sample/"); var b = new Uri("http://sam
这个问题在这里已经有了答案: Why does "true" == true show false in JavaScript? (5 个答案) 关闭 5 年前。 可能我很困惑,但我无法理解这个愚蠢
我是一名优秀的程序员,十分优秀!