实现线程同步之线程锁以及理解_线程锁的作用-程序员宅基地

线程锁的作用: 当多个线程同时进行任务时,为保证不会有多个线程对同一个数据进行操作造成不可预料的后果,加个锁,将此时的线 程变为单线程进行操作。

当多个线程同时执行lock.acquire时,只有一个线程能成功地获取锁,然后继续执行代码,其他线程就继续等待直到获得 锁为止。 获得锁的线程用完后一定要释放锁,否则那些苦苦等待锁的线程将永远等待下去,成为死线程。

线程锁的好处与坏处:

            好处:确保了某一段断码只能有一个线程从头到尾完整的执行。

            坏处:首先是阻止了多线程的多发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大的降低。

                      其次由于可以存在多个锁,不同线程存在不同的锁,并试图获取对方持有的锁时,可能会造成锁死,导致多个                            线程全部挂起,既不能执行也不能结束,只能靠操作系统强制终止。

方法一:

实例化对象方式—实现线程同步之线程锁

1.实例化一个锁对象;
lock=threading.Lock()
2.操作变量之前进行加锁
lock.acquire()
3.操作变量之后进行解锁
lock.release()

示例:

#money这个数据就是一个全局变量,当线程要对其进行操作时,就必须应用到线程锁。

import threading


#  银行存钱和取钱
def add(lock):
    global money  # 生命money为全局变量
    for i in range(1000000):
        # 2. 操作变量之前进行加锁
        lock.acquire()
        money += 1  # money;  money+1; money=money+1;
        # 3. 操作变量之后进行解锁
        lock.release()


def reduce(lock):
    global money
    for i in range(1000000):
        # 2. 操作变量之前进行加锁
        lock.acquire()
        money -= 1
        # 3. 操作变量之后进行解锁
        lock.release()


if __name__ == '__main__':
    money = 0
    # 1. 实例化一个锁对象;
    lock = threading.Lock()

    t1 = threading.Thread(target=add, args=(lock,))
    t2 = threading.Thread(target=reduce, args=(lock,))
    t1.start()
    t2.start()
    t1.join()
    t2.join()

    print("当前金额:", money)

方法二

继承方式—实现线程同步之线程锁

1. 实例化一个锁对象;

        lock = threading.Lock()

2. 操作变量之前进行加锁

    lock.acquire()

3. 操作变量之后进行解锁

        lock.release()

示例:

import threading
class AddThread(threading.Thread):
    def __init__(self, lock):
        super(AddThread, self).__init__()
        self.lock = lock
    def run(self):
        for i in range(1000000):
            # 2. 操作变量之前进行加锁
            self.lock.acquire()
            global  money
            money += 1  # money;  money+1; money=money+1;
            # 3. 操作变量之后进行解锁
            self.lock.release()

class ReduceThread(threading.Thread):
    def __init__(self, lock):
        super(ReduceThread, self).__init__()
        self.lock = lock
    def run(self):
        global money
        for i in range(1000000):
            # 2. 操作变量之前进行加锁
            lock.acquire()
            money -= 1
            # 3. 操作变量之后进行解锁
            lock.release()
if __name__ == '__main__':
    money = 0
    # 1. 实例化一个锁对象;
    lock = threading.Lock()
    t1 = AddThread(lock)
    t2 = ReduceThread(lock)
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print("当前金额:", money)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43279936/article/details/87891858

智能推荐

windows下配置IIS以及优化配置_windows iis-程序员宅基地

文章浏览阅读2.7k次。IIS配置及优化_windows iis

Python爬虫入门教程 80-100 Python 玩转NewSpaper爬虫框架_python 爬虫框架 newspaper-程序员宅基地

文章浏览阅读1.9w次,点赞3次,收藏6次。虽然newspaper框架存在不完美的地方,但是依然需要认识它_python 爬虫框架 newspaper

MP4学习(一)MP4格式分析_vc mvhd box-程序员宅基地

文章浏览阅读8.1k次,点赞4次,收藏15次。MP4格式分析mp4文件由一系列的box(也有人把它叫做atom)构成,每个box包含box头部和box体。box体可以包含普通的数据,也可以包含其他的box,如果box中包含了另一个box,这种box称为container box。box由head和body构造,head中指明了box的大小和类型,如果size为1,则表示这个box的大小为large size,真正的si_vc mvhd box

生产者与消费者 模型理解,与简单设计-程序员宅基地

文章浏览阅读571次。题外话:从中秋请假到现在,接近20天的假期,让我彻底耍晕了,现在来写代码,发现始终没进入状态。以后建议大家没特殊事情,还是别请这么久啦,分开耍,有利于放松,也不至于耍得忘乎所以。我是一直想做互联网 并发 大数据方面的工作,有兴趣才有动力嘛,企业开发感觉活力不强,太多重复的劳动,还是喜欢研究 解决问题,有挑战的东东。线程这块,生产者与消费者模型一直是很经典的东东,这里我用自己的理解分享一下,有误..._现场总线生产者与消费者模型分析

MyBatis-Plus使用queryWrapper解决字符串中含数字的排序问题_mybatis字符串数字排序-程序员宅基地

文章浏览阅读7.4k次,点赞6次,收藏9次。今天遇到了Oracle数据库字符串(含数字)排序问题,这里记录的是如何用MyBatis-Plus的queryWrapper条件构造器来解决的方法。造成的原因:数据库字段为varchar类型(若为Number类型则无此问题)数据库字符串排序是按照顺序一位一位比较的,按照ascII码值比较。如:2比1大,所以12会排在2前面解决办法:先按字符串长度排序,再按字段排序关键代码(queryWrapper条件构造器实现形式)//利用数据库length函数获取字符串长度(这里的code是我数据库中的_mybatis字符串数字排序

kube operator部署kubernetes集群_kubeop-程序员宅基地

文章浏览阅读1.3k次。kube operator简介kube operator是一个kubernetes集群部署及多集群管理工具,提供web ui支持在离线环境部署多个kubernetes集群。KubeOperator 是一个开源项目,通过 Web UI 在 VMware、OpenStack 和物理机上规划、部署和运营生产级别的 Kubernetes 集群。支持内网离线环境、支持 GPU、内置应用商店,已通过 CNCF 的 Kubernetes 软件一致性认证。官网:https://kubeoperator.io/离线包_kubeop

随便推点

华为鸿蒙系统(Huawei HarmonyOS)

华为鸿蒙系统Huawei HarmonyOS

JS读取粘贴板内容-程序员宅基地

文章浏览阅读4.9k次。1.1 监听onpaste事件1.1.1 定义和用法npaste 事件在用户向元素中粘贴文本时触发。注意:虽然使用的 HTML 元素都支持 onpaste 事件,但实际上并非支持所有元素,例如 <p> 元素, 除非设置了 contenteditable 为 "true" (查看下文的更多实例)。提示:onpaste 事件通常用于 type="text" 的 ..._js 获取粘贴板内容 移动端

Win10系统下软件UI显示不完整解决方案_用苹果设计的ui在win显示不明显-程序员宅基地

文章浏览阅读4.7k次,点赞2次,收藏4次。在最初升级win10的时候就想到了这些问题,例如和各种软件的不兼容性。当然,事实上win10并没有想象的那么糟,作为一个windows user 来说,win10的确是很高大上的,无论是颜值或者是体验,都让人爱不释手。下面我就说一下最近和win10的那些事之一:在win10系统下安装了IBM Cognos Transform后,Transform的一些设计界面不能完全显示,而后我们就是要想办法_用苹果设计的ui在win显示不明显

HTTP方式在线访问Hadoop HDFS上的文件解决方案

为了通过HTTP方式在线访问HDFS上的文件,您可以利用WebHDFS REST API或者HttpFS Gateway这两种机制实现。1:httpfs是cloudera公司提供的一个hadoop hdfs的一个http接口,通过WebHDFS REST API 可以对hdfs进行读写等访问2:与WebHDFS的区别是不需要客户端可以访问hadoop集群的每一个节点,通过httpfs可以访问放置在防火墙后面的hadoop集群3:httpfs是一个Web应用,部署在内嵌的tomcat中。

WordPress优化Google广告加载速度_wordpress 怎么做谷歌优化-程序员宅基地

文章浏览阅读236次。网站的快速加载是良好用户体验和搜索引擎优化的要素之一,但每当谷歌AdSense的广告代码部署到网站上时,速度都会显着下降,这是因为要下载大量文件才能显示广告,并且其中包含大量无用、被墙的请求及代码。_wordpress 怎么做谷歌优化

c# controls.add 控件的使用 ,间接引用还是值引用_this.controls.add-程序员宅基地

文章浏览阅读8.6k次。c# controls.add 控件的使用 10函数内部用下面代码增加控件:Button btn = new Button();btn.Location = new Point( 20, 20);btn.Size = new Size( 60,40);btn.Text = "btn'sText";this.Controls.Add( btn );问题:函数执行完后,bt_this.controls.add