可能有的地方是这么回答的:大部分情况是如此。但是不都是如此。
具体的例子在官方文档中已经给出。
但是实际上从线程安全的概念出发,上面说的虽然是对的,但也不算是正确答案。
list 和dict 不是线程安全
线程安全 (thread-safe) 是指支持多线程同时访问的特性,不论是否是操作共享数据
重入(reentrant) 则是指支持多线程读,但是共同操作共享数据可能会引起值未定义的情况
Python 的 GIL 锁保证解释器只有一个线程在运作,某些情况下,会发生线程切换,在 GIL 机制下,访问 list 和dict 的数据一般是线程安全的,但是如果进行写操作:
比如对于列表 D
D[i] = D[i] + 1
这条指令包含多个动作,它不是原子操作,多线程运行时,可能会发生值未定义的情况
- 装载 D[i]
- 将 D[i] 的值加 1
- 将值存回 D[i]
以下这些操作是 atomic 的:
L.append(x)
L1.extend(L2)
x = L[i]
x = L.pop()
L1[i:j] = L2
L.sort()
x = y
x.field = y
D[x] = y
D1.update(D2)
D.keys()
而这些不是
i = i+1
L.append(L[-1])
L[i] = L[j]
D[x] = D[x] + 1
不是 atomic 时 需要上锁,保证代码被唯一的线程操作
网友评论