目录
1.死锁
1.什么是死锁
多个线程需要多个锁的时候,不同线程抢到了不同的锁,每个线程不愿释放已获取的锁,同时等待其他线程释放锁,导致了线程互相等待,称之为死锁。
2.死锁产生的条件
要有多个锁。
要有多个线程。
不同线程获取到了不同的锁。
3.代码演示
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
synchronized ("第一把锁") {
System.out.println("线程一获取到了第一把锁");
synchronized ("第二把锁") {
System.out.println("线程一获取到了第二把锁");
System.out.println("线程一把门打开了!!!");
}
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
synchronized ("第二把锁") {
System.out.println("线程二获取到了第二把锁");
synchronized ("第一把锁") {
System.out.println("线程一获取到了第一把锁");
System.out.println("线程二把门打开了!!!");
}
}
}
}
}).start();
}
执行结果
线程一获取到了第一把锁
线程一获取到了第二把锁
线程一把门打开了!!!
线程一获取到了第一把锁
线程一获取到了第二把锁
线程一把门打开了!!!
线程一获取到了第一把锁
线程一获取到了第二把锁
线程一把门打开了!!!
线程一获取到了第一把锁
线程一获取到了第二把锁
线程一把门打开了!!!
线程一获取到了第一把锁
线程二获取到了第二把锁
这种情况下,有可能线程一将第一把锁和第二把锁都拿到开门,也有可能线程二将两把锁都拿到开门,还有可能线程一和线程二分别拿到一把锁,这个时候就进入到了死锁状态。
2.线程状态
1.线程状态说明
NEW:新建状态
Runnable:可运行状态
Blocked:锁阻塞状态
Waiting:无限等待状态
Timed Waiting:计时等待状态
Terminated:终止状态
2.线程状态转换图
3.等待唤醒机制
Object类中有两个方法:
wait() :让当前线程进入等待状态
notify() :唤醒一个正在等待的线程
注意事项:这两个方法必须使用同步锁对象来调用。
- 两个方法的小疑问
-
两个方法必须写在同步里面吗?
是,因为必须用锁对象来调用,同步里面才有同步锁。
-
为什么两个方法定义在Object类中而不是线程Thread类中?
因为方法是需要同步锁对象来调用的,而锁对象可以是任意类型对象,也就是说任意对象都可能调用这个方法。
-
-
wait()等待和sleep()睡眠的区别:
sleep()方法抱着锁睡觉
wait()方法释放锁等待
以上就是部分死锁与线程状态的知识点啦,后续会继续补充。各位大佬如发现有知识点错误或者有不同的建议与意见,欢迎评论、私信指正,本人才疏学浅还需向各位大佬学习,还请不吝赐教!在此感谢各位的观看!谢谢!