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

答:全局解释器锁是在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. 用户模式 Linux 移植

    用户模式 Linux (UML) 是一个有趣的概念. 它被构建为一个分开的 Linux 内核移植, 有 它自己的 arch/um 子目录. 它不在一个新的硬件类型上运行, 但是; 相反, 它运行在一 ...

  2. js简单实现promise

    function myPromise(fn){ let status='pending',successCallback=[],failedCallback=[],data=null,reason=n ...

  3. maxmind geoip2使用笔记

    客户需求如下,nginx的访问日志中ip,匹配出对应的国家,省份和城市,然后给我了一个maxmind的连接参考. 查找资料,有做成hive udf的使用方式, 我们项目中一直使用 waterdrop ...

  4. 第二阶段:流程图:8.axure绘制简单业务流程图

    元件库选择流程图 流程图示例 一个简单的注册练习 线上可以写字 作业

  5. 适配器模式 iOS

    前言: 最近需求作一个公共空间的需求,最后决定用适配器模式来做. 首先,需求是什么? 在我们app中,会有很多列表,tableviewcell的样式会比较统一(当然,我之前在公司那个app不算很大,基 ...

  6. java中发送http请求的方法

    package org.jeecgframework.test.demo; import java.io.BufferedReader; import java.io.FileOutputStream ...

  7. 【温故知新】Java web 开发(一) 新建项目

    简述本文写作目的:本文主要用于回忆基础 java web 项目的搭建,在不使用 Spring 等框架的前提下,单纯使用 jsp 和 servlet 完成. 1. 新建 maven 项目,不使用 arc ...

  8. 从0开发3D引擎(一):开篇

    介绍 大家好,本系列带你踏上Web 3D编程之旅- 本系列是实战类型,从0开始带领读者写出"良好架构.良好扩展性.最小功能集合(MVP)" 的3D引擎. 本系列的素材来自我们的产品 ...

  9. @程序员,你们还在用网上乱找的方法导入导出Excel么,我们给你造了个轮子!!!!!

    程序员的显著特点 有一天跟一位同事跟我闲聊,讨论起过去若干年软件行业的感受,他问了个问题:你觉得一个好的软件工程师最显著的特点是什么? 我想了一会,说:大概是坐得住吧. 某种意义上来说,在互联网技术飞 ...

  10. 洛谷$P4177\ [CEOI2008]\ order$ 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 开始看感$jio$长得好像和太空飞行计划差不多的,,,然后仔细康康发现还有租操作,,, 按一般的套路碰到这样儿的一般就先按非特殊化的建图然后考虑怎么实现这个 ...