java产生死锁的原因以及如何避免死锁

什么是死锁?

两个或者两个以上的线程在执行过程中,去争夺一个共享的资源,导致互相等待的现象,如果没有外部干预的话,就会一直处于阻塞状态,无法往下再执行,这样等待处于阻塞状态的线程,被称为死锁

什么条件下会产生死锁?

互斥条件:

共享资源a和b只能被一个线程占用

请求和保持条件:

线程T1已经获取共享资源a,在等待共享资源b的时候不释放共享资源a

不可抢占条件:

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

循环等待条件:

线程T1等待线程T2占有的资源,线程T2等待线程T1占有的资源,这形成了循环等待

如何避免死锁?

破坏互斥条件:

无法破坏

破坏请求和保持条件:

在首次执行时一次性申请所有的资源

破坏不可抢占条件:

主动释放线程占有的资源

破坏循环等待条件:

按序申请资源来预防死锁的产生

线程产生死锁之后,如何解决?

1、重启程序

2、Kill线程

总结:

个人认为关于死锁最有意义的问法应该是如何预防,而不是如何解决!!!

你可能感兴趣的:(java,jvm,开发语言)