概念:两个或多个线程一直在相互等待其他线程完成而使得所有线程都始终处在阻塞的状态
死锁产生的四个必要条件:
1>资源互斥使用性,即当资源被一个线程使用(占有)时,别的线程不能使用
2>资源的不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
3>执行者请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占用。
4>执行者循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。
查看死锁:
1>使用JDK给我们的的工具JConsole,可以通过打开cmd然后输入jconsole打开。
2>直接使用JVM自带的命令
1)首先通过 jps 命令查看需要查看的Java进程的vmid
2)然后利用 jstack 查看该进程中的堆栈情况,在cmd中输入 jstack -l 7412。
避免死锁:
解决方式:
1)java.util.concurrent.locks.Lock
ReentrantLock
ReentrantReadWriteLock
尽量使用tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock), 设置超时时间,超时可以退出防止死锁。
2)尽量使用java.util.concurrent(jdk 1.5以上)包的并发类代替手写控制并发,
比较常用的是ConcurrentHashMap、ConcurrentLinkedQueue、AtomicBoolean等等,实际应用中java.util.concurrent.atomic十分有用,简单方便且效率比使用Lock更高。
3)尽量降低锁的使用粒度,尽量不要几个功能用同一把锁,能锁块不锁方
4)尽量减少同步的代码块,synchronized
5)检查线程的执行顺序,避免资源竞争。
目前,Java语言已经广泛应用于生活中的各个领域,无论是网络编程还是数据库编程,甚至是web开发都有Java语言的身影。很多小伙伴都喜欢在网上寻找教程,但遗憾的是很多小伙伴看完教程后都一头雾水,即便是学会了也是一知半解,如果你真的想学习JAVA 推荐你一个群【521595826】,只要你有一颗想学习的心就肯定能学会,不是想学习的就不要加了,不然也只是在浪费时间。