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

Posted cslnight

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象锁,CPU时间片,阻塞队列相关的知识,希望对你有一定的参考价值。

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时间片,阻塞队列的主要内容,如果未能解决你的问题,请参考以下文章

新建就绪运行阻塞死亡状态

sleepwait方法之间区别

解决线程安全问题

synchronized关键字,Lock对象,阻塞队列问题

线程的状态及其转换

自旋锁