线程锁(四)

前面篇幅讲了很多理论及原理性东西,今天想了想,来点现实场景的东西把前面的内容串一串

一. 死锁产生的原因 1) 系统资源的竞争

通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在 运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不可剥夺资源的竞争 才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。

2) 进程推进顺序非法

进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁。例如,并发进程 P1、P2分别保持了资源R1、R2,而进程P1申请资源R2,进程P2申请资源R1时,两者都 会因为所需资源被占用而阻塞。

信号量使用不当也会造成死锁。进程间彼此相互等待对方发来的消息,结果也会使得这 些进程间无法继续向前推进。例如,进程A等待进程B发的消息,进程B又在等待进程A 发的消息,可以看出进程A和B不是因为竞争同一资源,而是在等待对方的资源导致死锁。

3) 死锁产生的必要条件

产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生。

 

互斥,共享资源 X 和 Y 只能被一个线程占用;

占有且等待,线程 T1 已经取得共享资源 X,在等待共享资源 Y 的时候,不释放共享资源 X;

不可抢占,其他线程不能强行抢占线程 T1 占有的资源;

循环等待,线程 T1 等待线程 T2 占有的资源,线程 T2 等待线程 T1 占有的资源,就是循环等待

 

下面就定义来演示一个死锁场景的例子:

public class Transfer { private String accountName; private int balance; public Transfer(String accountName, int balance) { this.accountName = accountName; this.balance = balance; } public void debit(int amount){ //更新转出方的余额 this.balance-=amount; } public void credit(int amount){ //更新转入方的余额 this.balance+=amount; } public String getAccountName() { return accountName; } public void setAccountName(String accountName) { this.accountName = accountName; } public int getBalance() { return balance; } public void setBalance(int balance) { this.balance = balance; } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwxjd.html