问题:已经有了全局解释器锁为什么还需要锁?

答:全局解释器锁是在Cpython解释器下,同一时刻,多个线程只能有一个线程被cpu调度

  它是在线程和cpu之间加锁,线程和cpu之间有传递时间,即使有GIL,也无法保证数据的绝对安全

锁的分类

1、互斥锁

2、死锁

3、递归锁

# 虽然有全局解释器锁,数据仍然出现了安全问题
from threading import Thread
import time def test():
global n
temp = n
time.sleep(1)
n = temp - 1 n = 10
t_li = []
for i in range(5):
t = Thread(target=test)
t_li.append(t)
t.start()
[t.join() for t in t_li]
print(n) #

互斥锁

# 使用锁,解决了数据安全问题
from threading import Thread, Lock
import time def test(lock):
lock.acquire()
global n
temp = n
time.sleep(1)
n = temp - 1
lock.release() n = 10
lock = Lock()
t_li = []
for i in range(5):
t = Thread(target=test, args=(lock, ))
t_li.append(t)
t.start()
[t.join() for t in t_li]
print(n) #

死锁

# 科学家吃面
from threading import Lock
from threading import Thread
import time
noddle = Lock()
chopsticks = Lock() def test1(name):
noddle.acquire()
print('%s拿到面条' % name)
# time.sleep(2)
chopsticks.acquire()
print('%s拿到筷子' % name)
print('%s吃面' % name)
# time.sleep(1)
chopsticks.release()
noddle.release() def test2(name):
chopsticks.acquire()
print('%s拿到筷子' % name)
time.sleep(0.3)
noddle.acquire()
print('%s拿到面条' % name)
print('%s吃面' % name)
noddle.release()
chopsticks.release() t1 = Thread(target=test1, args=('tom', ))
t1.start()
t2 = Thread(target=test2, args=('abc', ))
t2.start() t3 = Thread(target=test1, args=('joker', ))
t3.start()
t4 = Thread(target=test2, args=('ff', ))
t4.start()

递归锁

# 递归锁,多个acquire()不会造成死锁
from threading import RLock
from threading import Thread
a = RLock() def test():
a.acquire()
a.acquire()
a.acquire()
print('hello, world') Thread(target=test).start()
# 科学家吃面 递归锁
from threading import RLock
from threading import Thread
import time
noddle = chopsticks = RLock() def test1(name):
noddle.acquire()
print('%s拿到面条' % name)
# time.sleep(2)
chopsticks.acquire()
print('%s拿到筷子' % name)
print('%s吃面' % name)
# time.sleep(1)
chopsticks.release()
noddle.release() def test2(name):
chopsticks.acquire()
print('%s拿到筷子' % name)
time.sleep(0.3)
noddle.acquire()
print('%s拿到面条' % name)
print('%s吃面' % name)
noddle.release()
chopsticks.release() t1 = Thread(target=test1, args=('tom', ))
t1.start()
t2 = Thread(target=test2, args=('abc', ))
t2.start()
t3 = Thread(target=test1, args=('joker', ))
t3.start()
t4 = Thread(target=test2, args=('ff', ))
t4.start()

pyhton 线程锁的更多相关文章

  1. NSLock线程锁的使用测试

    测试1:NSLock线程锁是不是单例? 打印: 结论1:NSLock不是单例 测试2:同一个线程锁在不同的地方锁定,是否会有锁定两个? 打印为: 结论2:顺序打印,在不同的地方锁定也可以锁定. 测试3 ...

  2. day9---多线程,线程锁,队列

    进程.线程 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 使用threading模块实现多线程编程[综述] Pyt ...

  3. python线程锁

    import time,threading balance = 0 lock = threading.Lock() def change_it(n): global balance balance = ...

  4. linux下使用线程锁互斥访问资源

    linux使用线程锁访问互斥资源: 1.线程锁的创建 pthread_mutex_t g_Mutex; 2.完整代码如下 #include <stdio.h> #include <s ...

  5. JAVA线程锁-读写锁

    JAVA线程锁,除Lock的传统锁,又有两种特殊锁,叫读写锁ReadWriteLock 其中多个读锁不互斥,读锁和写锁互斥,写锁和写锁互斥 例子: /** * java线程锁分为读写锁 ReadWri ...

  6. Java线程锁一个简单Lock

    /** * @author * * Lock 是java.util.concurrent.locks下提供的java线程锁,作用跟synchronized类似, * 单是比它更加面向对象,两个线程执行 ...

  7. python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)

    python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...

  8. Linux同步机制(一) - 线程锁

    1 互斥锁 在线程实际运行过程中,我们经常需要多个线程保持同步. 这时可以用互斥锁来完成任务.互斥锁的使用过程中,主要有 pthread_mutex_init pthread_mutex_destor ...

  9. 单例模式——使用GCD实现单例模式 & 非ARC单例模式 &使用GCD和线程锁实现单例模式-b

    1.单利模式概述 链接:  iOS开发懒汉模式&恶寒模式 2.使用GCD实现单利模式 2.1新建一个project,然后新建一个HMDataTool类展示GCD实现单例模式 #import & ...

随机推荐

  1. River Hopscotch-[二分查找、贪心]

    Description Every year the cows hold an event featuring a peculiar version of hopscotch that involve ...

  2. element-ui后台管理系统表单resetFields功能实现

    项目中有‘新增’和‘编辑’弹出dialog功能,并且为同一个dialog. html代码: 新增时,这样的样式 编辑时,这样的样式 所以在编辑完关闭dialog后,需要清空表单,一开始简单的使用了el ...

  3. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(13)之会员登录注册

    源码下载地址:http://www.yealuo.com/Sccnn/Detail?KeyValue=c891ffae-7441-4afb-9a75-c5fe000e3d1c 会员中心,是我们与用户交 ...

  4. String、StringBuffer和StringBuild区别

    String String是不可变对象,即对象一旦生成,就不能被更改.对String对象的改变会引发新的String对象的生成. String s = "abcd"; s = s+ ...

  5. Python 多组输入

    #基于Python2.7 #若是想Python做到和C++中while(scanf()!=EOF)一样的多组输入效果,可以如实例所示书写 #实例实现了多组输入,计算A+B+C并输出的任务 while ...

  6. Python中的[...]是什么?

    ...就是好几个冒号 array[...] 就是array[:,:,:]

  7. 利用python第三方库提取PDF文件的表格内容

    小爬最近接到一个棘手任务:需要提取手机话费电子发票PDF文件中的数据.接到这个任务的第一时间,小爬决定搜集各个地区各个时间段的电子发票文件,看看其中的差异点.粗略统计下来,PDF文件的表格框架是统一的 ...

  8. Ceph 之RGW Pub-Sub Module

    Overview Pub-Sub module 顾名思义是一个发布订阅相关的模块.Pub-Sub module 为对象存储的变更事件提供一种发布-订阅机制.而发布-订阅架构本身应用非常广泛,如公有云G ...

  9. poj1737-----这题有毒

    这题有毒,不取模还会溢出,我哭了 <进阶指南>p337动态规划 公式就是个这了,代码就不贴了,反正是错的,用java算了

  10. 微服务Dubbo和SpringCloud架构设计、优劣势比较

    本文主要围绕微服务的技术选型.通讯协议.服务依赖模式.开始模式.运行模式等几方面来综合比较Dubbo和Spring Cloud 这2种开发框架.架构师可以根据公司的技术实力并结合项目的特点来选择某个合 ...