16.同一把锁
作者:互联网
同一把锁
引言
本节给大家演示一下,多个线程争夺同一把锁和不同锁的场景。
同一把锁
首先自定义一个任务,任务内容就是两个线程分别去执行两个不同的同步代码块,如何做到这一点?我们可以定义一个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