24.Lock锁的等待唤醒机制(Condition)

 

Lock锁的等待唤醒机制(Condition

 

lock锁的等待唤醒机制和synchronize的等待唤醒机制稍微有点不同,lock锁的等待唤醒机制主要是靠condition实现的,condition是通过lock锁的new condition方法获取的,该方法返回一个绑定到lock锁上的condition对象,每调用一次newcondition方法,返回的都是一个新的condition对象,

 

 

这一点大家要注意。Condition它本身是1个接口,它里面定义了7个方法,这7个方法前5个是和等待相关的,后2个是和唤醒相关的。

 

 

 

 

而wait方法的作用是使当前线程等待直到唤醒或被中断为止。Awaituninterruptibly方法的作用是使当前线程等待直到唤醒位置,它无法被中断。

接下来的三个方法的作用是一样的,都是定时等待,超过等待时间自动唤醒。Signal方法的作用是唤醒一个等待的线程。Signalall方法的作用是唤醒所有等待的线程,那么这些方法和我们之前synchronize同步锁的方法有哪些是对应的呢?

 

 

这是一张condition与synchronize的同步锁的方法对照表,其中wate对应await,定时等待有两个对应的方法。Notify 对应 signal。Notifyall 对应signalAll。Awaituninterruptibly和awaitutil在synchronize同步锁中没有对应的方法,以上就是condition与synchronize同步锁方法。

所有的对应关系。

这里列举的是condition,

 

 

常用的方法有三个,分别是await和signal以及signalAll。

下面我们来依次演示这三个方法。第一个演示的方法是await,第二个演示的方法是signal,第三个演示的方法是signalAll,首先也是第一个方法await,使当前线程等待,自定义一个任务。在任务中声明一把锁为什么是声明而不是初始化?因为有两个线程会用到锁,其中一个线程会来执行这个task,任务在执行过程中会被等待,另一个线程获取到锁以后来,唤醒这个等待的线程。 


所以锁不在这里创建,而是通过构造方法将创建好的锁传递进来。再声明一个condition对象,和锁一样,也是不在这里创建,通过构造方法传递进来,重载
task构造方法,用于初始化lock和condition,再来编写任务部分,调用lock方法获取锁,写上try---catch代码块,在finally代码块中释放锁,在try代码块中调用condition的 await方法,使当前线程等待,醒后,输出当前线程名称,至此任务代码编写完成。

 

 

下面来执行task任务。首先创建一把锁,然后将condition创建出来,接着创建任务,并将lock和condition对象传递给任务,然后创建一个线程,将任务传递给线程,最后启动线程,观察执行结果。 

 

 


从执行结果来看,线程被等待,程序未结束,a
wait方法演示完毕。

 

 

再来演示第二个方法signal,唤醒单个等待的线程。接着刚刚的程序写,使主线程休眠一秒钟,一秒钟之后获取锁,然后调用condition的signal方法唤醒单个等待的线程,最后释放锁

 

 

观察执行结果。从执行结果来看,线程在一秒钟之后被唤醒,程序结束,

 

 

signal方法演示完毕,再来也是第三个方法。signalAll唤醒所有等待的线程,改写刚刚的程序,创建出三个线程并启动,将唤醒单个等待的线程,改为唤醒所有等待的线程。 

 

 


观察执行结果,从执行结果来看,所有等待的线程全部被唤醒,程序结束

 

 

至此lock锁的等待唤醒机制介绍完毕。

总结

最后我们来总结一下本节的内容。本节介绍了lock锁的等待唤醒机制,它是通过condition实现的,condition它本身是一个接口,里面有7个与之相关的方法,这些方法的作用在这里就不再赘述了,其中只有await和signal以及signalall是常用方法,在实际开发中condition经常被使用。 

 

 


  

附录:

笔记完整文本:

洛克索的等待唤醒机制和synchronize的等待唤醒机制稍微有点不同,locally锁得等待换行机制主要是靠condition实现的,condition是通过logo锁的new condition方法获取的,该方法返回一个绑定到logo手上的condition,对象,每调用一次六抗d型方法,返回的都是一个新的肯定性对象,这一点大家要注意。Condition它本身是1个接口,它里面定义了7个方法,这7个方法前5个是和等待相关的,后2个是和唤醒相关的。而wait方法的作用是使当前线程等待直到唤醒或被中断位置。Await on interrupt不定方法的作用是使当前线程等待直到唤醒位置,它无法被中断。 接下来的三个方法的作用是一样的,都是定时等待,超过等待时间自动唤醒。Signal方法的作用是唤醒一个等待的行程。赛克罗o方法的作用是唤醒锁有等待的性质,那么这些方法和我们之前生根来子的同步锁的方法有哪些是对应的呢?这是一张condition与synchronize的同步锁的方法对照表,其中wate对应await,电池等待有两个对应的方法。Notify doing signal。Notify all during the federal of在super nice的同步锁中没有对应的方法,以上就是condition与super nice的同步锁方法。 锁有的对应关系。这里列举的是condition,常用的方法有三个,分别是await和signal以及森格勒o下面我们来依次演示这三个方法。第一个演示的方法是await,第二个演示的方法是三个了,第三个演示的方法是similar,首先也是第一个方法而wait,使当前线程等待制定一个任务。在任务中声明一把锁为什么是声明而不是初始化?因为有两个线程会用到数,其中一个县城会来执行这个task,任务在执行过程中会被等待,另一个线程获取到锁以后来,唤醒这个等待的县城。 锁以锁不在这里创建,而是通过构造方法将创建好的锁传递进来。再声明一个肯定性对象和锁一样,也是不在这里创建,通过更多方法传递进来,承载task各种方法用于初始化look和condition,再来编写任务部分,调用look方法或其锁写上try翻了你大板块,在翻了你代码块中释放锁在try代码块中调用condition的 wait方法使当前线程等待,行后输出当前线程名称,至此任务代码编写完成。下面来执行task任务。首先创建一把手,然后将condition创建出来,接着创建任务,并将洛克和condition对象传递给任务,然后创建一个线程,将任务传递给线程,最后启动线程,观察执行结果。 从执行结果来看,线程被等待程序未结束,而wait方法演示完毕。再来演示第二个方法,Segal唤醒三个等待的线程。接着刚刚的程序写时,主线程休眠一秒钟,一秒钟之后获取锁,然后调用condition的signal方法唤醒单个等待的线程,最后释放锁观察执行结果。从执行结果来看,县城在一秒钟之后被唤醒,程序结束,赛克鲁方法演示完毕,再来也是第三个方法。赛克罗o唤醒锁有等待的线程,改写刚刚的程序,创建出三个线程并启动,将唤醒单个等待的线程,改为唤醒锁有等待的线程。 观察执行结果,从执行结果来看,锁有等待的线程全部被唤醒,程序结束,至此logo锁的等待换境机制减少完毕。最后我们来总结一下本节的内容。本节介绍了洛克索的等待唤醒机制,它是通过condition实现的condition它本身是一个接口,里面有7个与之相关的方法,这些方法的作用在这里就不再赘述了,其中只有await和single以及single aws是常用方法,在实际开发中condition经常被使用。

 

posted @ 2022-05-03 22:31  小陈子博客  阅读(872)  评论(0编辑  收藏  举报