死锁出现的原因有很多。避免死锁不是一句话就能解决的。通常来说,当某个同步对象在等待另一个同步对象所拥有的资源上的锁时,便会产生死锁。
试着运行下下面的程序。它会告诉你什么是死锁。这个死锁是由于两个线程都在等待对方所拥有的资源,因此会产生死锁。它们会一直等待,没有谁会先放手。
运行结果:
Addition Thread: 13
Subtraction Thread: 7
Holding First Lock…
Holding Second Lock…
Addition Thread: Waiting for AddLock…
Subtraction Thread: Waiting for SubLock…
但如果调用的顺序变一下的话,死锁的问题就解决了。
将 MySubtractionThread中的线程加锁顺序调换再看看
运行结果:
Addition Thread: 13
Holding First Lock…
Addition Thread: Waiting for AddLock…
Threads: Holding Add and Sub Locks…
Subtraction Thread: 7
Holding Second Lock…
Subtraction Thread: Waiting for SubLock…
Threads: Holding Add and Sub Locks…
三种用于避免死锁的技术:
1>加锁顺序
2>加锁时限
3>死锁检测
一个更好的方案是给这些线程设置优先级,让一个(或几个)线程回退,剩下的线程就像没发生死锁一样继续保持着它们需要的锁。如果赋予这些线程的优先级是固定不变的,同一批线程总是会拥有更高的优先级。为避免这个问题,可以在死锁发生的时候设置随机的优先级。
已有 22658 名学员学习以下课程通过考试
最需教育客户端 软件问题一手掌握
去 App Store 免费下载 iOS 客户端
点击加载更多评论>>