死锁原因

杀马特。学长 韩版系。学妹 提交于 2020-03-01 23:12:32

1.交叉锁会导致程序死锁

这个大家都很熟悉了,就是线程A持有R1的锁又想获取R2的锁,线程B持有R2的锁又想获取R1的锁。两个谁也不放弃自己的又想要对方的,就导致死锁了。

一般交叉引起的死锁线程都会进入BLOCKED状态,CPU资源占用不高,可以借助jstack或jconsole工具诊断。

2.内存不足

如两个线程A和B执行某个任务,A已获取10MB内存,B已获取20MB内存,它们执行都需要30MB的内存,但剩余可用的内存不够30MB了,两个线程就有可能都在等待彼此释放内存资源。

3.C/S数据交换

服务端开启某端口,等待客户端访问,客户端发送请求立即等待接收,由于某种原因服务端错过了客户端的请求,仍在等待,就会陷入双方都在等待对方发送数据。

4.数据库锁

表级别或行级别锁,比如某个线程执行for update 语句退出了事务,其他线程访问该数据库时都将陷入死锁。

5.死循环引起的死锁(系统假死)

 

HashMap是线程不安全的,它的put方法会陷入死循环,具体原因参考并发HashMap的put操作引起死循环

死循环会导致程序假死,不是真正的死锁,但某个线程对CPU消耗过多,导致其他线程等待CPU,内存等资源就也会陷入死锁等待。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!