一直都说Threed.sleep是不会释放鎖,而wait是释放锁的(对象锁)现理论上来分析一下啊。
由于CPU分配的每个线程sleep的时间片极为短暂(一般为几十毫秒)所以,CPU通过不停地切换线程sleep執行这样就给程序员一种错觉,以为多个线程sleep是在同时执行sleep就是正在执行的线程sleep主动让出CPU,CPU去执行其他线程sleep在sleep指定的时间过后,CPU才會回到这个线程sleep上继续往下执行如果当前线程sleep进入了同步锁,sleep方法并不会释放锁即使当前线程sleep使用sleep方法让出了CPU,但其他被同步锁挡住叻的线程sleep也无法得到执行
* (休息2S,阻塞线程sleep) 以验证当前线程sleep对象的机锁被占用时, 是否被可以访问其他同步代码块分析:主线程sleep启动起来,因為创建线程sleep等的资源消耗所以主线程sleep会先执行 dt.secondMethod(),因此会先输出prepare run second method其后执行secondMehtod方法(注意该方法是要先闹到锁对象),而该方法直接将线程sleep睡眠2s(注意此处对象锁DeepenSleep的实例对象并没有释放)然后执行线程sleepdt的run方法,该方刚发执行dt的firstMethod然而,该方法也是需要获取锁对象的而此时他没先不能获取到,因为secondMehtod没有释放锁(准确点讲主线程sleep没有释放锁);然后等了2s,主线程sleep睡眠时间已过他warkup之后,因为还拥有锁因此直接run secondMethod嘚剩下的方法,先输出”wake up”,然后执行 number*200执行完,主线程sleep释放掉锁而dt线程sleep拿到锁,执行run方法拿到锁,执行run方法的synchronized的剩余方法:先输出”in first method”然后执行加100的操作。
我们来变一下将firstMethod的同步去掉看输出是什么样子
* (休息2S,阻塞线程sleep) 以验证当前线程sleep对象的机锁被占用时, 是否被可以访問其他同步代码块分析:不同点在于,主线程sleep睡眠之后没有释放锁,dt线程sleep执行firstMethod并不需要锁因此先run firstMethod中的逻辑,先加100然今,主线程sleep睡醒の后再执行剩下的逻辑,乘以200
不一定,在未来的1000毫秒内线程sleep不想再参与到CPU竞争。那么1000毫秒过去之后这时候也许另外一个线程sleep正在使用CPU,那么这时候操作系统是不会重新分配CPU的直到那个线程sleep挂起或结束;况且,即使这个时候恰巧轮到操作系统进行CPU 分配那么当前线程sleep也不一定就是总优先级最高的那个,CPU还是可能被其他线程sleep抢占去
boss:“给你睡0小时”。
coder:“你TM逗我啊”
休眠0ms,这样的休眠有何意义Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争重新计算优先级”。竞争的结果也许是当前线程sleep仍然获得CPU控制权也许会换成别的线程sleep获得CPU控制权。这也是我们在大循环里面经常会写一句Thread.sleep(0) 因为这样就给了其他线程sleep比如Paint线程sleep获得CPU控制权的权力,这样界面就不会假死在那里