线程锁(互斥锁)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程锁(互斥锁)相关的知识,希望对你有一定的参考价值。

1、线程锁

  当我们执行多线程计算时,某些情况,会导致计算的结果,并不是我们想要的真实的结果。

  例如下面的例子,预计结果sum=50,实际中多次运算的结果中,某些情况,不等于50;

  

import threading
import time

def worker(n):
print ("threading [%s] is begin!" % n)
global sum
sum+=1
time.sleep(2)
print ("threading [%s] is end!" % n)
start_time = time.time()
sum = 0
for i in range(50):
t = threading.Thread(target=worker,args = ("Thread-[%s]" % i,))
#t.setDaemon(True)#将子线程设置为守护线程
t.start()
print ("all is done !")
cost_time = time.time() - start_time
print (sum)
print (cost_time)

针对上面的例子,我们需要在计算的时候,添加线程锁,当填加了线程锁后,各线程在执行计算操作时,实际上变为串行
import threading
import time

def worker(n):
print ("threading [%s] is begin!" % n)
lock.acquire()
global sum
sum+=1
lock.release()
print ("threading [%s] is end!" % n)
start_time = time.time()
sum = 0
lock = threading.Lock()
#res_list = []
for i in range(50):
t = threading.Thread(target=worker,args = ("Thread-[%s]" % i,))
t.start()
#res_list.append(t)
# for t in res_list:
# t.join()
print ("all is done !")
cost_time = time.time() - start_time
print (sum)
print (cost_time)

多上述的例子来看,理论上加了锁,运行的结果,应该为想要的50,但从实际结果看,某些时候,依然运行不正确。
从结果看,有些线程未运行完成,主线程即结束了。如果加上join方法(即注释部分代码)后,多次结果的结果均为正确。
 

 

以上是关于线程锁(互斥锁)的主要内容,如果未能解决你的问题,请参考以下文章

ReentrantReadWriteLock场景应用

并发技术12线程锁技术的使用

java中ReentrantReadWriteLock读写锁的使用

java并发线程锁技术的使用

多线程安全----同步锁(互斥锁)

锁详解区分 互斥锁⾃旋锁读写锁乐观锁悲观锁