from threading import Thread, Lock
import time def func():
global n
n -= 1 n = 10
t_list = []
for i in range(10):
t = Thread(target=func,)
t_list.append(t)
t.start()
for t in t_list:
t.join()
print(n)

这段代码结果我们知道,因为GIL的原因,结果是0

再看如下代码:

from threading import Thread, Lock
import time def func():
global n
temp = n
time.sleep(0.1)
n = temp - 1 n = 10
t_list = []
for i in range(10):
t = Thread(target=func,)
t_list.append(t)
t.start()
for t in t_list:
t.join()
print(n)

打印结果却是9

为什么呢?

因为在0.1秒之内,所有线程肯定都进来了,但是需要睡0.1秒,这就是阻塞状态,他们会把手里的数据让给其他线程,所以每个线程的temp都是10,阻塞结束,10减1全变成9都写入内存,最终n的值就是9了,这样就导致数据的不安全了。

怎么改进?加锁就可以了

from threading import Thread, Lock
import time def func(lock):
lock.acquire()
global n
temp = n
time.sleep(0.1)
n = temp - 1
lock.release() lock =Lock()
n = 10
t_list = []
for i in range(10):
t = Thread(target=func, args=(lock,))
t_list.append(t)
t.start()
for t in t_list:
t.join()
print(n)

这样打印的结果就是0了。

线程锁Lock的更多相关文章

  1. 孤荷凌寒自学python第三十九天python 的线程锁Lock

    孤荷凌寒自学python第三十九天python的线程锁Lock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 当多个线程同时操作一个文件等需要同时操作某一对象的情况发生时,很有可能发生冲突, ...

  2. C# 关于线程锁lock的使用方法

    C# 关于线程锁lock的使用方法 原创 2016年09月02日 10:07:05 标签: c# / 线程 / 锁 / lock 11937 在多线程编程中,可能会有许多线程并发的执行一段代码(代码块 ...

  3. Android多线程研究(9)——线程锁Lock

    在前面我们在解决线程同步问题的时候使用了synchronized关键字,今天我们来看看Java 5.0以后提供的线程锁Lock. Lock接口的实现类提供了比使用synchronized关键字更加灵活 ...

  4. 并发库应用之四 & 线程锁Lock应用

    Java5的线程并发库中,提供了相应的线程锁接口Lock来帮助我们同步处理.Lock比传统线程模型中的synchronized更加面向对象,锁本身也是一个对象,两个线程执行的代码要实现同步互斥效果,就 ...

  5. C# 线程锁Lock 死锁

    使用lock场景 多线程环境中,不使用lock锁,会形成竞争条件,导致错误. 使用lock 锁 可以保证当有线程操作某个共享资源时,其他线程必须等待直到当前线程完成操作. 即是多线程环境,如果一个线程 ...

  6. JDK5.0 特性-线程锁Lock

    来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291470.html import java.util.concurrent.Executor ...

  7. 线程锁Lock ,Rlock

    锁的引入: 我们查看官方文档:https://docs.python.org/3/library/threading.html#lock-objects 原语锁:threading.Lock 实现原始 ...

  8. JAVA线程锁lock下Condition的使用

    import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti ...

  9. JAVA线程锁lock下Condition高级使用-多个Condition的整合使用

    import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti ...

随机推荐

  1. 广告行业中常说的 CPC,CPM,CPD,CPT,CPA,CPS 等词的意思是什么?

    广告投放流程主要分为展示和转化,CPC/CPM/CPD/CPT/CPA/CPS等代表的是不同的结算模式 展示端的结算方式有: CPM(Cost Per Mille) 每千人成本:只要向足够量级的用户展 ...

  2. puttygen 命令行 id_rsa.pub 转 ppk

    网上只有puttygen GUI程序的说明,我是linux下的环境,懒得切换到win下了,putty 也有linux版本的,不过可用软件会少点,且GUI会没win下完善. 其实 一条命令搞定: put ...

  3. 超图不支持JPEG格式的WMTS服务

    就目前面而言,超图不支持JPEG格式的WMTS服务,只支持PNG格式的. <本篇完>

  4. go test 测试用例那些事

    go test命令,相信大家都不陌生,常见的情况会使用这个命令做单测试.基准测试和http测试.go test还是有很多flag 可以帮助我们做更多的分析,比如测试覆盖率,cpu分析,内存分析,也有很 ...

  5. Swift Struct 结构体

    前言 Swift 语言有两种基本的数据类型,即类(class)和结构体(struct),class 这样的概念大家不会陌生,而 struct 也并不是什么新的概念,在 Objective-C 和 C ...

  6. CZT变换(chirp z-transform)

    作者:桂. 时间:2018-05-20  12:04:24 链接:http://www.cnblogs.com/xingshansi/p/9063131.html 前言 相比DFT,CZT是完成频谱细 ...

  7. jQuery(三) javascript跨域问题(JSONP解决)

    加油~ --WH 一.什么是javascript跨域问题? 域:服务器域名,唯一标识(协议,域名,端口)必须保证一致,说明域相同 跨域:在一个服务器上,去访问另一个服务器上,并且得到另一个服务器返回回 ...

  8. adb获得安卓系统版本及截屏

    [时间:2017-09] [状态:Open] [关键词:adb, android,系统版本,截屏,screencap] 本文主要是我遇到的android命令行用法的一个简单总结 系统版本 获取系统版本 ...

  9. MySQL架构总览->查询执行流程->SQL解析顺序

    Reference:  https://www.cnblogs.com/annsshadow/p/5037667.html 前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后 ...

  10. python输出有色记录

    一.第三方模块coloredlogs # Create a logger object. import logging logger = logging.getLogger('your-module' ...