java线程堆栈问题定位第二讲:多线程中的锁解读
来源:互联网 发布:php易支付 编辑:程序博客网 时间:2024/05/24 03:56
一、wait()和sleep的共同点与区别:
共同点:都会把当前的线程阻塞住(时长的为函数参数指定的时间),即为睡眠或等待
区别:wait()
当线程执行到wait()方法上,当前线程会释放监视锁,此时其它线程可以占有该锁,一旦wait()方法执行完成,当前线程又继续持有该锁,直到执行完该锁的作用域。可以说wait()是多线程场合下用得最多的一个方法。结合notify(),可以实现两个线程之间的通信,一个线程可以通过这种方法通知另一个线程继续执行,完成线程之间的配合。wait()和锁的示意图如下:
上述图中wait()方法,退出的条件:
执行时间满足函数中设置的时间
其它线程调用了notify()方法
sleep():这个函数与线程占用的锁无关,如果一个线程占用该锁(即进入同步块后,执行到了sleep()函数,仍然保持对该锁的占用,如下图所示:
从上面可知,sleep()与锁无关
二、线程状态 与 锁 对应的关系
a.线程占用锁,线程堆栈会打印- locked <0x00000007810025d8>
b.线程等待其它资源释该锁,线程堆栈中会打印 -waiting to lock <0x00000007810025d8>
c.线程占用一个锁,且执行到此锁中的wait()方法上,线程堆栈会打印locker(),然后会打印 -waiting on<0x00000007810025d8>
这三个线程的状态对应的锁,应是java多线程机制中锁的最常见的表现方式,了解这三个对应的含义,对分析线程快照中内容就很容易了。
三、线程中状态:
a:runnable状态,运行状态
b:TIMED_WAITING(on object monitor)当前线程被挂起一段时间,说明该线程正在执行obj.wait(int time)方法.
d.TIMED_WAITING(sleeping) 当前线程被挂起一段时间,即正在执行Thread.sleep(inttime)方法.
e.TIMED_WAITING(parking) 当前线程被挂起一段时间,即正在执行Thread.sleep(int time)方法.
f.WAINTING(on object monitor) 当前线程被挂起,即正在执行obj.wait()方法(无参数的wait()方法).
上述中线程状态中:TIMED_WAITING、WAINTING状态的线程一定不消耗CPU,线程处于处于RUNNABLE的线程,要结合当前线程代码的性质判断,是否消耗CPU,比如说:java运算的代码,则会消耗CPU,网络IO,则很小消耗CPU,对于本地代码,其判断是否消耗CPU,方法一致
- java线程堆栈问题定位第二讲:多线程中的锁解读
- JAVA线程堆栈问题定位第一讲
- java线程堆栈问题定位第三讲
- JAVA多线程问题分析定位--线程堆栈
- JAVA多线程问题分析定位--线程堆栈
- Java问题定位之Java线程堆栈分析
- JAVA中的堆栈问题
- Java问题定位之如何借助线程堆栈进行问题分析
- Java中的多线程,线程锁,以及死锁
- 使用Java线程堆栈分析问题
- java多线程学习之停止休眠中的线程问题
- Java多线程-----第二节:线程池详解
- java中的线程和多线程
- 第十三章 多线程 第二讲
- 第十三章 多线程 第二讲
- Java中的多线程问题
- Java中的多线程问题
- java中的多线程问题
- T-SQL(一)
- 《编程导论(Java)·2.2.3 变量的声明模型》
- ios8.3 越狱之后,没有ps,top等命令
- T-SQL(二)自定义函数的控制流语句
- Acdream 1113 The Arrow(概率dp)
- java线程堆栈问题定位第二讲:多线程中的锁解读
- 从rand5到rand7的思路和代码验证
- android handler创建的简单原理
- 欢迎使用CSDN-markdown编辑器
- less 学习备份
- 飘逸的python - 单例模式乱弹
- 内部类 匿名内部类与接口
- 纸上谈兵: 图 (graph)
- SQL存储过程、触发器和游标