标签: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
标签:obj 释放 sync 有一个 对象锁 执行 todo 入队 调用
原文地址:https://www.cnblogs.com/cslnight/p/12722961.html