线程死锁

本文深入探讨了同步锁机制带来的线程安全解决方案及其潜在弊端,如效率降低和死锁风险。详细解析了Object类中wait()与sleep()的区别,以及如何通过notify()方法实现线程间通信,有效避免死锁并提高程序执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然同步锁机制解决了线程安全问题,但是也带来一些弊端:     1. 效率会降低,每次都需要判断锁的状态     2. 可能引发死锁(彼此占用所需要的资源),出现的概率非常小,非常特殊.

线程之间彼此占用对方所需的资源,就是死锁, 死锁会造成程序阻塞

爸爸说:“给我成绩单,就给你零花钱”,儿子说:“给我零花钱,就给你成绩单”,如果两人互不相让...

当死锁发生后,要么等待同步锁自动释放,要么手动解锁.

因为任何对象都有锁,所以Object类提供了释放锁的方法:

public final void wait(),让当前线程等待,同时释放锁,直到被再次唤醒

public final void wait(long timeout),在指定时间内让当前线程等待,同时释放锁

wait()和sleep()都可以让当前线程等待,区别:     1.  sleep():释放执行权(等待),不释放锁     2.  wait():释放执行权(等待),同时释放锁

三.线程间通信
1.通信:打电话   发短信   QQ
2.线程间通信不是说线程之间互相发消息/传数据
3.线程间是相互独立/互不联系的
4.通信:A线程唤醒被wait()的B线程
  Object类中有notify()方法,用来实现唤醒
5.思路:A线程和B线程必须认识同一个人(同一把锁),相当于中间人
  A线程告诉锁,锁去叫醒B线程
6.同步锁不仅可以解决线程安全问题,还可以实现线程间通信
7.案例:两个美女吵架(必须你骂一句,我骂一句)
     案例:交替输出数字
8.细节:notify()和wait()方法必须在同步代码块内进行调用

唤醒线程的方法:notify方法(Object中)

如果调用的是无参的wait()方法,那锁就一直释放,当前线程就一直等待, 还需要唤醒。Object类提供了notify()方法用来唤醒某个被wait()的锁,也就 是唤醒线程 细节: wait()和notify()方法都是操作锁的,而锁存在于同步中,也就是说这两个 方法必须出现在同步中(同步代码块或同步方法)。同步锁不仅可以解决 昨天的线程安全问题,还可以实现线程间的通信

五.线程状态
1.每个线程在不同的时间处于不同的状态
2.就绪状态    运行状态   死亡状态   阻塞状态   等待状态
3.清楚某方法执行后线程是什么状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值