并发之美$漫谈多线程

在MainThread上面创建多线程后,线程们通过时间片轮转,纷纷执行着自己的虚拟栈。

当一个线程获得cpu执行权,进入运行状态后,突然遇到同步代码块<synchronized>。在这片神奇的区域,一次只能进去一个人。与此同时,其他的线程也走到了这里。可是只能cpu只能一个线程用,风水轮流转,时间片轮到谁,谁就能进到同步代码区。于是这一个幸运的线程就诞生了!其他的竞争者只能去候选区--锁池等着了。首先这个幸运的线程monitor.Enter得到监视器,获得对象锁。既然进到了这里,就必须一口气运行完这个区域所有的代码,在这个时候不会任何线程在抢他的执行权了。

正执行着,突然这个线程遇到了一个wait(),好像交警查车,扣了他的对象锁<monitor.exit>,马上让他进到等待池里等着传唤。在锁被释放后,这把锁又引起锁池的线程们的一阵血雨腥风,又幸运的线程开始了他的同步代码块之旅。他的情况可能是顺顺利利出来了<没有遇到wait()--交警>。也可能是和上一代锁的主人一样的命运。

还有一种可能就是去当救世主!走到半路,他遇到了notifyAll()--神仙,指点这个线程去拯救那些困于等待池的线程们。他执行了这个notifyAll()方法,把等待池里的等待线程唤醒,给他们重新做人的希望。然后这些等待池里的线程去了锁池继续竞争奋斗。接着这个线程又走完了这块同步区域,然后把锁释放,又在锁池展开了血雨腥风,故事如此相似...


里面涉及:锁池 等待池 wait() notifyAll() 一些基本概念。

注意红色区域就是wait()和notify()在锁的释放上面的区别。

补充:

join():用来阻塞主线程,直到调用该方法者的代码执行完,join()才会结束。

sleep():让这个线程睡觉进入阻塞状态,而且不释放锁。

同步队列:等待获得锁的线程队列.      emmmm我觉得这就是锁池...

等待队列:被wait()后,处于没有cpu执行权的状态。只能等着被notify()唤醒.       emmmm我觉得这就是等待池...


今天看了java特种兵,感叹知识深度原来还很欠缺。这才发现自己以前的博客太浅陋。 一直以为博客总结的很好很全,看博客学习才是捷径。而最近发现“重博客轻书籍”不能养成一种系统性思维,知识过于离散,不能前后连贯。而且博客好坏,新手浑然不知,更不利于培养自己的思考能力。

回归经典,少一点赶英超美的浮躁,多一点立雪扎马的踏实。 

看视频入门--看经典深入--看博客解惑--写博客总结    





猜你喜欢

转载自blog.csdn.net/weixin_42126680/article/details/80345061