Lock()与RLock()锁

资源总是有限的,程序运行如果对同一个对象进行操作,则有可能造成资源的争用,甚至导致死锁
也可能导致读写混乱

锁提供如下方法:
1.Lock.acquire([blocking])
2.Lock.release()
3.threading.Lock() 加载线程的锁对象,是一个基本的锁对象,一次只能一个锁定,其余锁请求,需等待锁释放后才能获取

4.threading.RLock() 多重锁,在同一线程中可用被多次acquire。如果使用RLock,那么acquire和release必须成对出现,
调用了n次acquire锁请求,则必须调用n次的release才能在线程中释放锁对象

例如:
无锁:

#coding=utf8
import threading
import time

num = 0

def sum_num(i):
global num
time.sleep(1)
num +=i
print num

print ‘%s thread start!‘%(time.ctime())

try:
for i in range(6):
t =threading.Thread(target=sum_num,args=(i,))
t.start()

except KeyboardInterrupt,e:
print "you stop the threading"

print ‘%s thread end!‘%(time.ctime())
输出:

Sun May 28 20:54:59 2017 thread start!
Sun May 28 20:54:59 2017 thread end!
01
3
710
15
1
2
3
4
5
6
结果显示混乱

引入锁:

#coding=utf8
import threading
import time

num = 0

def sum_num(i):
lock.acquire()
global num
time.sleep(1)
num +=i
print num
lock.release()

print ‘%s thread start!‘%(time.ctime())

try:
lock=threading.Lock()
list = []
for i in range(6):
t =threading.Thread(target=sum_num,args=(i,))
list.append(t)
t.start()

for threadinglist in list:
threadinglist.join()

except KeyboardInterrupt,e:
print "you stop the threading"

print ‘%s thread end!‘%(time.ctime())
结果:

Sun May 28 21:15:37 2017 thread start!
0
1
3
6
10
15
Sun May 28 21:15:43 2017 thread end!
其中:
lock=threading.Lock()加载锁的方法也可以换成lock=threading.RLock()

如果将上面的sum_num修改为:

lock.acquire()
global num
lock.acquire()
time.sleep(1)
num +=i
lock.release()
print num
lock.release()
那么:
lock=threading.Lock() 加载的锁,则一直处于等待中,锁等待
而lock=threading.RLock() 运行正常

原文地址:https://www.cnblogs.com/yoyo1216/p/10129761.html

时间: 2024-10-12 20:25:59

Lock()与RLock()锁的相关文章

互斥锁LOCK()与RLOCK()

资源总是有限的,程序运行如果对同一个对象进行操作,则有可能造成资源竞争,也可能导致读写混乱,此时需要引入锁. 锁提供如下方法: 1.Lock.acquire([blocking])    # 上锁2.Lock.release()      # 解锁3.threading.Lock()      # 加载线程的锁对象,是一个基本的锁对象,一次只能一个锁定,其余锁请求,需等待锁释放后才能获取 4.threading.RLock() 多重锁,在同一线程中可用被多次acquire.如果使用RLock,那

java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)

import java.util.concurrent.locks.*; class DuckMsg{ int size;//烤鸭的大小 String id;//烤鸭的厂家和标号 DuckMsg(){ } DuckMsg(int size, String id){ this.size=size; this.id=id; } public String toString(){ return id + " 大小为:" + size; } } class Duck{ private int

线程调度的问题:Lock Convoy(锁封护)与Priority Inversion(优先级反转)

Lock Convoy(锁封护) [1]Lock Convoy是在多线程并发环境下由于锁的使用而引起的性能退化问题.当多个相同优先级的线程频繁地争抢同一个锁时可能会引起lock convoy问题,一般而言,lock convoy并不会像deadlock或livelock那样造成应用逻辑停止不前,相反地,遭受lock convoy的系统或应用程序仍然往前运行,但是,由于线程们频繁地争抢锁而导致过多的线程环境切换,从而使得系统的运行效率大为降低,而且,若存在同等优先级下不参与锁争抢的线程,则它们可以

“全栈2019”Java多线程第二十七章:Lock获取lock/释放unlock锁

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第二十七章:Lock获取lock/释放unlock锁 下一章 "全栈2019"Java多线程第二十八章:公平锁与非公平锁详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回

Python进阶(3)_进程与线程中的lock(互斥锁、递归锁、信号量)

1.同步锁 (Lock) 当各个线程需要访问一个公共资源时,会出现数据紊乱 例如: 1 import threading,time 2 def sub(): 3 global num #对全局变量进行操作 4 5 temp=num 6 time.sleep(0.001) #模拟线程执行中出现I/o延迟等 7 num=temp-1 #所有线程对全局变量进行减一 8 9 time.sleep(1) 10 11 num=100 12 l=[] 13 14 for i in range(100): 15

【10.4】线程同步--Lock、RLock

1 #!/user/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import dis 5 import threading 6 from threading import Lock 7 total = 0 8 lock = Lock() 9 10 11 def add(): 12 global total 13 global lock 14 for i in range(1000000): 15 # 获取锁 16 lock.acquire() 17 t

说说lock到底要锁谁?

波安搬... http://www.cnblogs.com/wolf-sun/p/4209521.html ----------------------------------------------------- 分割线 ------------------------------------------------------------------ 写在前面 最近一个月一直在弄文件传输组件,其中用到多线程的技术,但有的地方确实需要只能有一个线程来操作,如何才能保证只有一个线程呢?首先想到的

Lock的公平锁与非公平锁

注:lock是可重入锁 lock锁分为两类:公平锁和非公平锁.按照本人的理解,公平锁指的是在多个线程同时获取锁时,会按照该线程的请求先后顺序来决定哪个线程优先获取到锁(即:根据同步队列中的线程顺序来决定),非公平锁则是自由竞争,和线程的等待时间无关. 而且非公平锁可能出现一个线程连续获取锁的现象(原因是当一个线程请求锁时,只要获取了同步状态即成功获取锁.在这个前提下,刚释放的线程再次获取同步状态的几率非常大) package com.zhl.practice; import org.junit.

python Lock、RLock

Lock: 只能acquire一次,下一次acquire必须release后才能,不然会造成死锁 from threading import Lock total = 0 lock = Lock() def add(): #1. dosomething1 #2. io操作 # 1. dosomething3 global lock global total for i in range(1000000): lock.acquire() total += 1 lock.release() def