• 22.非阻塞式获取锁


    非阻塞式获取锁

     引言

    本节介绍一个和lock锁相关的知识点,非阻塞式获取锁。有非阻塞式就有阻塞式,下面通过两个动画来帮助我们理解他们的意思,以上厕锁为例,

    我们先来看阻塞式上厕锁,一群人排着队,依次等待上厕锁。换成线程来说的话,就是一群线程排着队获取锁,只要是等待,那就是阻塞。线程阻塞锁的就是线程在等待获取锁。

    再来看看非阻塞式上厕锁,上厕锁时发现有人,不等待先去别处逛逛,或者先干点别的事。

    如果将其换成线程来说的话,就是线程发现锁已经被其他线程获取了,此时不等锁释放先去处理其他任务,这就是非阻塞式不等待

    演示阻塞式

    下面我们将分别演示阻塞式非阻塞式获取锁。首先来看阻塞式获取锁,以synchronize的为例,在同步代码块中使当前线程睡眠一秒钟,一秒钟之后输出当前线程名称,

    用两个线程去执行该任务集中,必定有一个线程获取锁,还有一个线程阻塞,

    从执行结果来看,两次输出线程名称前后间隔一秒钟,说明有线程的确被阻塞。

    下面来看一下lock锁阻塞式的例子,使用lock方法获取锁,unlock方法释放锁,将同步代码写在它们中间,这里就不再演示执行结果了

    因为结果和刚刚的一样

    非阻塞式获取锁

    接下来看看非阻塞式获取锁是怎样的,lock锁的trylock方法的作用,就是非阻塞式获取锁。该方法返回一个布尔类型的结果,如果锁可用返回true,否则返回false。 


    下面讲解一下非阻塞式获取锁的书写格式。首先是使用
    if语句判断trylock返回结果,返回处说明锁可用,无需再调用lock方法获取锁,将同步代码写在try代码块中,将释放锁代码写在finally代码块中,返回false说明锁不可用,将其他代码写在else语句中,以上就是非阻塞式获取锁完整的书写格式。

    按照刚刚的格式来演示非阻塞式获取锁,自定义一个任务,在任务中定义一把锁,使用trylock获取锁判断其返回结果,在if语句中写上try finally代码块,在finally代码块中释放锁将需要同步的内容写在try代码块中。 

    例如这里将当前线程休眠一秒钟,一秒钟之后输出当前线程名称,当锁不可用时执行其他任务,例如说出一句话,

    执行任务的demo还是沿用之前的,这里不再重复写。

    下面来看看执行结果怎么样,

    从执行结果来看,两个线程其中一个线程获取到了锁,另外一个线程没有拿到锁,但是他也没有等待锁,转而去执行了其他任务,没有造成线程阻塞。

    Trylock还有一个重载方法,也适用于非阻塞式获取锁,只不过它可以定时什么意思?就是在指定时间范围内,尝试获取锁。如果在指定时间内锁可用,方法返回true,超时则返回false,它有两个参数,分别是等待锁的最长时间time和指定时间单位的unit,该方法返回一个布尔类型的结果,在指定时间内锁可用

    返回true,否则返回false。在等待锁的过程中,当线程被中断时,还会引发线程中断异常。

    下面我们将使用trylock的重载方法来替代trylock方法,三秒钟之内探索可不可用,使用try---catch方法抛出的异常。

    下面来看看执行结果,从执行结果来看,

    第一个线程使用锁不到三秒钟就释放了,第二个线程由于三秒钟之内拿到锁,于是他就拿着锁完成了同步任务。

    总结

    最后来总结一下本节的内容。本节介绍了lock锁的两个非阻塞式获取锁的方法,这两个方法的作用在这里就不再赘述了,在实际开发中这两个方法经常被使用。 


      

    附录:

    笔记完整文本:

    本节介绍一个和looks相关的知识点,非阻塞式获取锁由非阻塞式就有阻塞式,下面通过两个动画来帮助我们理解他们的意思,以上厕锁为例,我们先来看左侧是上厕锁,一群人排着队,依次等待上厕锁。换成县城来说的话,就是一群县城排着队获取锁,只要是等待,那就是阻塞。线程阻塞说的就是县城在等待或缺乏。再来看看非组设施上厕锁,上厕锁时发现有人不等待先去别处逛逛,或者先干点别的事。 如果将其换成线程耐熟的话,就是线程发现锁已经被其他线程获取了,此时不等左释放先去处理其他任务,这就是非阻塞式。不等待下面我们将分别演示阻塞式非阻塞式或切数。首先来看主色是活曲锁,以synchronize的为例,在同步代码块中使当前线程睡眠一秒钟,一秒钟之后输出当前线程名称,用两个线程去执行该任务集中,必定有一个线程获取数,还有一个线程阻塞,从执行结果来看,两次输出县城名称前后间隔一秒钟,说明有县城的确被阻塞。下面来看一下look锁左侧时的例子,使用look方法获取数,按note方法释放,锁将同步代码写在它们中间,这里就不再演示执行结果了,因为结果和刚刚的一样,接下来看看非阻塞式获取锁是怎样的,洛克索的创业logo方法的作用就是非阻塞式获取锁该方法返回一个布尔类型的结果,如果锁可用返回处,否则返回false。 下面讲解一下非组测试获取锁的书写格式。昨天是使用if语句判断try lock返回结果,返回处说明锁可用,无需再调用look方法获取数,将同步代码写在try代码块中,将释放锁代码,携带finally代码快中,返回4th说明锁不可用将其他代码写在as语句中以上,就是非组算式获取锁完整的书写格式。按照刚刚的格式来延迟非阻塞式获取锁自定义一个任务,在任务中定义一把锁使用track获取锁判断其返回结果,在if语句中写上try finally单板块,在finally代码块中释放塑胶需要,同步的内容写在try代码块中。 例如这里将当前线程休眠一秒钟,一秒钟之后输出当前线程名称,当锁不可用时执行其他任务,例如说出一句话,执行任务的demo还是沿用之前的,这里不再重复写。下面来看看执行结果怎么样,从执行结果来看,两个线程其中一个线程获取到了数,另外一个县城没有拿到锁,但是他也没有等待说转而去执行了其他任务,没有造成线程阻塞。Try look还有一个重载方法,也适用于非阻塞式获取数,只不过它可以定时什么意思?就是在指定时间范围内,常识活期锁如果在指定时间内锁可用方法反馈出超时则返回forth,它有两个参数,分别是等待锁的最长时间、time和指定时间单位的unity,该方法返回一个布尔,类型的结果在指定时间内锁可用。 防火处,否则返回4th在等待锁的过程中,当线程被中断时,还会引发线程中断异常。下面我们将使用try lock的重载方法来替代try look方法,三秒钟之内探索可不可用,使用拆开开启补和方法抛出的异常。下面来看看执行结果,从执行结果来看,第一个线程使用锁不到三秒钟就释放了,第二个线程由于三秒钟之内拿到锁,于是他就拿着锁完成了同步任务。最后来总结一下本节的内容。本节介绍了洛克索的两个非阻塞式获取锁的方法,这两个方法的作用在这里就不再赘述了,在实际开发中这两个方法经常被使用。

  • 相关阅读:
    aspnet中存储session的各种方法
    Response.ContentType 详细列表
    常用命令行命令
    关于使用request[this.控件名.Unique]获取控件值的问题
    在Asp.net中动态添加css文件,js文件,控件
    关于.Net中垃圾回收机制的理解:
    简单概念
    天健
    (转)高效调用lua函数
    (转)hlsl函数
  • 原文地址:https://www.cnblogs.com/cj8357475/p/16086064.html
Copyright © 2020-2023  润新知