java线程堆栈问题定位第二讲:多线程中的锁解读

一、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,方法一致

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值