当存在竞争资源的行为时,最好是加上锁,否则可能导致资源的混乱,下面来看一个例子:
import threading
lock = threading.Lock()
alist = []
def with_lock(n):
lock.acquire()
alist.append(n)
print(alist)
lock.release()
def without_lock(n):
alist.append(n)
print(alist)
for i in range(0,10):
tar = threading.Thread(target=without_lock, args=(i,))
tar.start()
上面的代码分别为加锁,和不加锁的情况下向列表alist中添加元素,它们最终的目的都是向alist中添加了10个元素,但在过程我我们打印alist分别得到下面的结果:
# with lock
[0]
[0, 2]
[0, 2, 1]
[0, 2, 1, 3]
[0, 2, 1, 3, 4]
[0, 2, 1, 3, 4, 5]
[0, 2, 1, 3, 4, 5, 6]
[0, 2, 1, 3, 4, 5, 6, 7]
[0, 2, 1, 3, 4, 5, 6, 7, 8]
[0, 2, 1, 3, 4, 5, 6, 7, 8, 9]
# without lock
[0]
[0, 1]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
为什么会出现这种情况呢,因为在我们打印的过程中可能存在读和写的操作.所以当可能存在这种情况时最好加上锁