线程总结(四)
怎么检测一个线程是否拥有锁?
- 可以调用wait()方法,如果出现异常,就说明java中的线程没有持有锁。否则将持有锁。(这种方式不推荐)
- 我们可以使用API,Thread的一个静态方法
boolean isHave = Thread.holdsLock(User.class);
如果存在则返回true,没有持有User这个对象的锁,则返回false;
Jdk中排查多线程问题用什么命令
jstack
作用: 生成JVM当前时刻线程的快照(threaddump,当前进程中所有线程的信息)
目的:帮助快速定位程序问题出现的原因,如长时间停顿、cpu占用率过高。
向线程传递参数的三种基本方法
1. 通过构造方法传递数据
1 | package com.nyist.thread; |
2.通过变量和方法传递数据
1 | package com.nyist.thread; |
3.通过回调函数传递数据
1 | package com.nyist.thread; |
锁的降级和升级
ReadWriteLock是读写锁接口,里面有两个方法
1 | public interface ReadWriteLock { |
一个是读锁,一个写锁
降级锁: 由写锁到读锁
升级锁: 由读锁到写锁
1 | package com.nyist.thread; |
结果打印出来是 获得读锁. 这说明ReentrantReadWriteLock不可以锁升级
1 | package com.nyist.thread; |
结果打印出来是 写锁 获得读锁 这说明ReentrantReadWriteLock可以锁降级
FutureTask和Future区别
Future是一个接口,代表可以取消的任务,并且返回执行的结果。
FutureTask是实现了Futrue和Runnable接口