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,内存等资源就也会陷入死锁等待。
来源:CSDN
作者:ziyonghong
链接:https://blog.csdn.net/ziyonghong/article/details/104599050