码迷,mamicode.com
首页 > 其他好文 > 详细

对象锁,CPU时间片,阻塞队列

时间:2020-04-17 23:45:35      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:obj   释放   sync   有一个   对象锁   执行   todo   入队   调用   

1、一个线程占有一个对象的锁以后,CPU资源仍然能被其它线程抢走。

2、当其他线程抢走CPU资源后,发现获取不到对象锁,则此线程会进入阻塞状态,并且进入由于获取不到锁而阻塞的阻塞队列中。

3、当占有锁的线程释放对象锁的时候,就会立即唤醒等待对象锁的其他线程(都在阻塞队列中)

    上面说的释放对象锁,包括了所有释放对象锁的情况

      3-1、线程退出同步块

synchronized(obj) [ // 线程进入同步块时,会尝试获取锁

} //线程退出同步块时,会释放占有的对象锁,且唤醒其他等待锁的线程(都在阻塞队列中)

 

      3-2、线程调用了wait方法时,也会释放CPU,释放锁,因为wait也会引起锁的释放,而一旦释放锁,也就会立即唤醒哪些等待锁的线程。

 

线程阻塞的原因

1、获取锁,锁被其他线程占用,进入等待锁的阻塞队列中。(等待锁队列)

    只有占有锁的线程,释放锁时,才会唤醒这个队列中的线程。

2、正在占有锁的线程,调用了wait,就进入了wait阻塞队列。(wait阻塞队列)

    只有obj.notify()方法,才会唤醒这个队列中的线程。(释放锁,不能唤醒)

3、正在执行中的线程,调用了sleep或者IO,就进入了另一个阻塞队列。(sleep阻塞队列)

    睡眠时间到,或者IO阻塞结束,线程才得以继续进入可运行状态。

 

就绪队列:线程可以运行,就会进入队列。

线程调试工具:Thread Dump // TODO

 

对象锁,CPU时间片,阻塞队列

标签:obj   释放   sync   有一个   对象锁   执行   todo   入队   调用   

原文地址:https://www.cnblogs.com/cslnight/p/12722961.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!