此博客为原创
浅浅了解了一下加锁时候的wait和notif与线程之间的运行顺序。今天写下来记录一下,若是有任何疑问可以提出来,大家一起讨论。
在两个不同的线程之间,存在着运行先后和协作的问题,假设一个线程启动了,另一个线程才能执行其他的代码。例如在cs_framework中的通信层的一段代码。
建立通信信道这是一个线程(我们暂称为次线程),它在构造函数中将被启动,而构造函数又属于另一个线程中的一部分(我们暂称为主函数)(在本篇中不予深究)。
主线程和次线程的关系。。。。在执行主线程的时候应该是先建立通信信道,再进行信息的交互。主线程里在次线程启动前会有一些代码,所以我们是先执行主线程再启动次线程再回到主线程。
在执行主线程时,当我们运行到启动次线程的时候,并不代表着这个线程就会立刻启动,它会有一定的时间,而我们必须在信息的交互之前就要把通信信道建立起来,但是因为次线程的启动需要时间,有可能次线程还没有启动起来,主线程就已经开始执行信息的交互,这在逻辑上是不合理的。
因此我们需要在次线程的启动上加锁。然后在执行完次程序的启动我们使程序自己阻塞自己(就是wait),然后等到次线程启动起来了,我们再唤醒主程序(就是notify)。
当我们把程序加锁以后。看代码,在代码执行到27行的时候,会先检查锁是否上锁,上锁了之后就会进入阻塞状态。没有被上锁,就先上锁在执行里面的代码。
还有一种情况,当执行完启动次线程的语句,刚好时间片段到了,那么它就会进入就绪态,而此时次线程已被启动,就会与主线程一同竞争CPU,若是次线程竞争成功,它也会先检查锁,发现锁是上锁状态,于是进入阻塞状态。主线程运行后面的代码,32行,自己将自己进入阻塞状态,而只有次程序的notify才能唤醒它,这就保证了次线程启动起来了才会执行主程序后面的代码。
注意
wait后就会将锁打开,次程序就会被唤醒,进入就绪态,进入运行态后发现锁是打开的于是将锁关闭,执行里面的代码。
主线程与次线程用的是同一个锁。
感谢微易码教主指导。