Fan*_*753 6 python java concurrency hashmap
我知道字典在 python 中是原子的,但是(如果我错了,请纠正我)这意味着一次只能完成对字典的一个添加。根据 concurrentHashMap 的 Java 页面:“该表在内部进行了分区,以尝试允许指定数量的并发更新而不会发生争用。” python中的原子插入不会与Java实现的速度相比
编辑:当我写“这意味着一次只能完成对词典的一个添加”时,我的意思是说词典的状态将根据单个词典的添加进行离散化
C S*_*C S 11
在 Python 中,由于全局解释器锁 (GIL),一个进程一次只能执行一个 Python 字节码,而不管它有多少个线程。这意味着插入/更新/读取字典的键是线程安全的,这就是人们通常所说的字典的 get/put 是“原子的”的意思。†
但这意味着,正如您所怀疑的那样,尝试将不同键更新到同一字典的多个线程不会并发。当然,Java 没有 GIL 问题,因此多个线程可以同时更新 ConcurrentHashMap 中的不同键。这并不总是发生。这是可能的。ConcurrentHashMap 实现对键集进行分片并锁定每个分片。每个分片可以并发读取,但一次只能写入一个线程。
†:有时会指出使用__hash__Python 编写的方法的对象需要多个 Python 字节码,因此 puts 和 gets 本身不是原子的;然而,简单的 puts 和 get 仍然是线程安全的,因为它们不会导致崩溃或垃圾值,尽管您仍然可以有竞争条件。