死锁,线程休眠

一. 死锁
1.定义:在多线程编程中(两个或两个以上的线程)因为资源抢占而造成线程无限等待的问题。
2.线程和锁的关系(1对多) :
一个线程可以拥有多把锁;而一把锁只能被一个线程拥有。
3.排查死锁的工具:
(1) jconsole
在这里插入图片描述
(2)Java Visual VM
在这里插入图片描述
(3)JMC
在这里插入图片描述
4.死锁关键代码

死锁关键代码:
synchronized(lockA) {
Thread. sleep (1000) ;
synchroni zed (lockB) {

5.死锁操作的4个条件(同时满足) :
(1)互斥条件(一个资源只能被一 个线程持有,当被一个线程只有之后就不能被其它线程持有);系统属性,不可更改
(2)请求拥有条件(一个线程持有了一个资源之后又试图请求另个资源);可被修改
(3)不可剥夺条件(一个资源被一个线程拥有之后,如果这个线程不释放此资源,那么其他线程不能强制获得此资源);不可修改
(4)环路等待条件(多个线程在获取资源时形成了一个环形链);可以修改

6.如何解决死锁的问题?
从以下两个条件入手,修改以下条件任意一个:
(1)请求拥有条件
(2)环形等待条件(最容易实现) 解决死锁可以通过控制获取锁的顺序来解决(破坏了环路等待条件)。

二. sleep 休眠缺点,必须传递一个明确的结束时间
1.解决方法:
线程通讯机制:一个线程的动作可以让另一个线程感知到就叫做线程通讯。
wait (休眠) / notify (唤醒) / notifyAll (唤醒全部)
2.两个小问题
问题1: wait 为什么要加锁?
答: wait 在使用的时候必需要释放锁,在释放锁之前必须要有一把锁,所以要加锁。
问题2: wait 为什要释放锁?
答: wait 默认是不传任何值的,当不传递任何值的时候表示永久等待,这样就会造成死锁问题,一把锁被一个线程一直持有,为了避免这种问题的方式,所以在使用 wait 时一定要释放锁。
3.wait / notify / notifyAll 使用注意事项:
(1)在使用以上方法的时候必须要加锁。
(2)加锁对象和 wait / notify / notifyAll 的对象必须保持一致。
(3)一组 wait 和 notfiy / notfiyAll 必须是同一对象
(4)notifyAll只能唤醒当前对象的所有等待线程。
(5)几个wait方法
wait(long): void:毫秒级别的最大等待时间 wait(long, int): void:纳秒级别的最大等待时间 wait(): void:永久等待
4.Thread. sleep(0) VS 0bject. lock(0)区别:
(1)sleep是Thread 的静态方法;
而lock 是 0bject 的方法;
(2)sleep(0)表示立即触发一次CPU资源的抢占,lock(0) 表示永久的等待下去。
5.wait和sleep区别:
相同点:
(1)都可以让当前线程休眠;
(2)都必须要处理一一个Interrupt 异常。
不同点:
(1)wait来自于0bject 中的一个方法;而sleep 来自于Thread.
(2)传参不同,wait可以没有参数,而sleep 必须有一个大于等于0的参数。
(3)wait使用是必须加锁,sleep 使用时不用加锁。
(4)wait使用时会释放锁,而sleep 不会释放锁。
(5) wait默认不传参的情况下会进入WAITING 状态,而sleep 会进入线程
6.为什么wait 会放到0bject中而不是Thread?
答:wait操作必须要加锁和释放锁,而锁又是属于对象级别而非线程级别(线程和锁是一
对多的关系,也就是一个线程可以拥有多把锁),为了灵活起见(一个线程当中会有多把
锁),就把wait放在 0bject。

6.LockSupport 注意事项

7.wait 和 LockSupport 区别:
相同点:
(1)两个都可以让线程进行休眠.
(2)二者都可以传参或者不传参,并且二者线程状态也是一致的。
不同点:
(1) wait 必须要配合 synchronized 一起使用(必须加锁),而 LockSupport 不需要加锁。
(2)wait 只能唤醒全部或随机的一个线程,而 LockSupport 可以唤醒指定的线程。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值