ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

16.同一把锁

2022-05-03 15:01:36  阅读:167  来源: 互联网

标签:争夺 同一 标记 16 同步 线程 thread1 睡醒


 

同一把锁

 引言

本节给大家演示一下,多个线程争夺同一把锁和不同锁的场景。

 同一把锁

首先自定义一个任务,任务内容就是两个线程分别去执行两个不同的同步代码块,如何做到这一点?我们可以定义一个Boolean类型的标记,然后通过标记来切换不同线程去执行不同的代码块。所以这里我们还要定义一个更改标记的方法用于切换标记,接着在run方法中判断标记,先来编写if语句,也就是当标记为处时,在里面写上同步大模块,同步锁为task.class,同步内容就是使当前线程休眠三秒钟,目的是拿着锁三秒钟不放,看看另一个争夺锁的线程会不会等待,睡醒以后打印当前线程名称加睡醒了。

 

 


接下来编写else一句,也就是当标记为false时,写上同步所也为task.class的同步代码块,同步内容就是输出当前线程名称和一句话。

 

 

下面我们来执行这个任务,首先将任务创建出来,然后创建两个线程,让他们去争夺同一把锁,接着将任务分别传递给他们。这里我们先启动thread1,待会再启动thread2,因为在启动thread2之前,需要切换一次标记,达到不同线程执行不同代码块的目的。我们让主线程休眠一秒钟一秒钟之后去切换这个标记,使用try---catch捕获sleep方法抛出的异常。 

 

 

 


接着设置标记为false,因为标记的处时值为true,所以切换过后就是false。最后启动thread2。下面来看看运行结果,

 

 

这里说明一下结果中的thread0就是thread1对象,所谓的thread1就是所谓的thread2对象,因为线程取名都是从0开始的。好了,从运行结果来看,两个线程的确是在争夺同1把所, thread1拿着锁休眠了三秒钟,thread2在thread1睡醒之后输出内容。这就说明thread1拿着锁休眠的时候,thread2被阻塞了。他在等thread1释放锁。同时也说明,当线程拿着锁休眠时,是不会释放锁的。 

不同锁

以上就是同一把所的情况。下面我们再来看看不同锁的情况,修改任务代码,将else语句中的同步锁换成main.class,看看执行结果会怎么样。

 

 

 

 

从运行结果来看,thread2还没等thread1睡醒就已经打印了内容,整个程序是在thread1睡醒之后结束的,这就说明不同锁线程之间是不会相互争夺的,所以也就不会阻塞。

总结

最后我们来总结一下本节的内容,本节演示了多个线程争夺同一把锁和不同锁的情况,发现争夺同一把锁时线程会阻塞,争夺不同锁时,线程不会阻塞。 

 

 


  

附录:

笔记完整文本:

本节给大家演示一下多个线程争夺同位话所和不同所的场景。首先制定一个任务,任务内容就是两个线程分别去执行两个不同的同步大模块,如何做到这一点?我们可以定义一个bore类型的标记,然后通过标记来切换不同线程去执行不同的代码块。所以这里我们还要定义一个更改标记的方法用于切换标记,接着在run方法中判断标记,先来编写if语句,也就是当标记为处时,在里面写上同步大模块,同所谓task、点、class,同步内容就是使当前线程休眠三秒钟,目的是拿着锁三秒钟不放,看看另一个争夺所的先生会不会等待,睡醒以后打印当前线程名称加睡醒了。 接下来编写else一句,也就是当标记为false时,写上同步所也为task点class的同步大板块,同步内容就是输出当前线程名称和一句话。下面我们来执行这个任务,首先将任务创建出来,然后创建两个线程,让他们去争夺同一把锁,接着将任务分别传递给他们。这里我们先启动swear的一,待会再启动straight的二,因为在启动three的二之前,需要切换一次标记,达到不同线程执行不同代码块的目的。我们让主线程休眠一秒钟一秒钟之后去切换这个标记,使用tretite捕获sleep方法抛出的异常。 接着设置标记为forth,因为标记的处时值为true,所以切换过后就是false。最后启动swear的二。下面来看看运行结果,这里说明一下结果中的three的-0就是three的一对象,所谓的-1就是所谓的二对象,因为线程取名都是从0开始的。好了,从运行结果来看,两个县城的确是在争夺同18所 three的一拿着锁休眠了三秒钟thra的二在thread一睡醒之后输出内容。这就说明斯瑞的一拿着锁休眠的时候,Siri的二被阻塞了。他在等子瑞的一释放组同时也说明,当县城拿着锁休眠时是不会释放锁的。 以上就是同一把所的情况。下面我们再来看看不同所的情况,修改任务代码,将ears与剧中的同步所换成慢点class,看看执行结果会怎么样。从运行结果来看,three的二还没等,three的一睡醒就已经打印了内容,整个程序是在three的e睡醒之后结束的,这就说明不同所县城之间是不会相互争夺的,所以也就不会阻塞。最后我们来总结一下本节的内容,本节演示了多个县城争夺同一把锁和不同所的情况,发现争夺同一把锁时县城会阻塞,争夺不同所时,县城不会阻塞。

标签:争夺,同一,标记,16,同步,线程,thread1,睡醒
来源: https://www.cnblogs.com/cj8357475/p/16086037.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有