Java——锁与wait与notif——线程与线程的运行顺序

此博客为原创
浅浅了解了一下加锁时候的wait和notif与线程之间的运行顺序。今天写下来记录一下,若是有任何疑问可以提出来,大家一起讨论。

在两个不同的线程之间,存在着运行先后和协作的问题,假设一个线程启动了,另一个线程才能执行其他的代码。例如在cs_framework中的通信层的一段代码。

在这里插入图片描述
在这里插入图片描述

建立通信信道这是一个线程(我们暂称为次线程),它在构造函数中将被启动,而构造函数又属于另一个线程中的一部分(我们暂称为主函数)(在本篇中不予深究)。

主线程和次线程的关系。。。。在执行主线程的时候应该是先建立通信信道,再进行信息的交互。主线程里在次线程启动前会有一些代码,所以我们是先执行主线程再启动次线程再回到主线程。

在执行主线程时,当我们运行到启动次线程的时候,并不代表着这个线程就会立刻启动,它会有一定的时间,而我们必须在信息的交互之前就要把通信信道建立起来,但是因为次线程的启动需要时间,有可能次线程还没有启动起来,主线程就已经开始执行信息的交互,这在逻辑上是不合理的。

因此我们需要在次线程的启动上加锁。然后在执行完次程序的启动我们使程序自己阻塞自己(就是wait),然后等到次线程启动起来了,我们再唤醒主程序(就是notify)。

当我们把程序加锁以后。看代码,在代码执行到27行的时候,会先检查锁是否上锁,上锁了之后就会进入阻塞状态。没有被上锁,就先上锁在执行里面的代码。

还有一种情况,当执行完启动次线程的语句,刚好时间片段到了,那么它就会进入就绪态,而此时次线程已被启动,就会与主线程一同竞争CPU,若是次线程竞争成功,它也会先检查锁,发现锁是上锁状态,于是进入阻塞状态。主线程运行后面的代码,32行,自己将自己进入阻塞状态,而只有次程序的notify才能唤醒它,这就保证了次线程启动起来了才会执行主程序后面的代码。

注意

 wait后就会将锁打开,次程序就会被唤醒,进入就绪态,进入运行态后发现锁是打开的于是将锁关闭,执行里面的代码。
   
   主线程与次线程用的是同一个锁。

感谢微易码教主指导。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值