设计类网站策划书,校园二手网站建设目的意义,白云优化网站建设,网络服务提供者是谁目录#xff1a;
什么是死锁#xff1f;死锁是怎么产生的#xff1f;怎么排查死锁#xff1f;死锁的预防拓展#xff1a;Java CPU 100%排查
一 什么是死锁#xff1f;
注#xff1a;线程和进程都可能会产生死锁#xff0c;以下以线程为例
死锁是指两个或两个以上的…目录
什么是死锁死锁是怎么产生的怎么排查死锁死锁的预防拓展Java CPU 100%排查
一 什么是死锁
注线程和进程都可能会产生死锁以下以线程为例
死锁是指两个或两个以上的线程在执行过程中由于竞争资源或者由于彼此通信而造成的一种阻塞的现象
若无外力作用它们都将无法推进下去。
此时称系统处于死锁状态或系统产生了死锁这些永远在互相等待的线程称为死锁线程。另一种定义 集合中的每个线程都在等待只能由本集合内的其他线程才能引发的事件那么该组线程是死锁的。
竞争的资源可以是锁、网络连接、通知事件磁盘、带宽以及一切可以被称作“资源”的东西。
二 死锁是怎么产生的
死锁的主要产生原因
系统资源不足进程/线程运行的顺序不当资源分配不当
产生死锁的四个必要条件
互斥条件一个资源每次只能被一个线程使用请求与保持条件一个线程因请求资源而阻塞时对已获得的资源保持不放不剥夺条件线程已获得的资源在未使用完之前不能强行剥夺循环等待条件若干进程之间形成一种头尾相连的循环等待资源关系
这四个条件是死锁的必要条件只要系统发生死锁这些条件必然成立而只要上述条件之一不满足就不会产生死锁
常见死锁
避免死锁的一个通用的经验法则是
当多个线程都要访问资源A、B、C时保证使每个线程都按照同样的顺序去访问它们 即让所有线程按照同样的顺序获得一组锁
三、怎么排查死锁
首先编写一个死锁程序
public static void main(String[] args) {final Object a new Object();final Object b new Object();Thread threadA new Thread(new Runnable() {public void run() {synchronized (a) {try {System.out.println(now i in threadA-locka);Thread.sleep(1000l);synchronized (b) {System.out.println(now i in threadA-lockb);}} catch (Exception e) {// ignore}}}});Thread threadB new Thread(new Runnable() {public void run() {synchronized (b) {try {System.out.println(now i in threadB-lockb);Thread.sleep(1000l);synchronized (a) {System.out.println(now i in threadB-locka);}} catch (Exception e) {// ignore}}}});threadA.start();threadB.start();}上面的代码执行后就会出现死锁排查方法如下
方式1使用jps jstack
第一在windons命令窗口使用 jps -l 第二在windons命令窗口使用 jstack -l 9004 死锁信息如上图结合代码看就可以找出原因了。
方式2使用jconsole
在window打开 JConsoleJConsole是一个图形化的监控工具 四、死锁预防
遇见问题解决问题是一般人的思维。高手都是提前预见问题并有效预防。
死锁的常见预防思路如下
以确定的顺序获得锁超时放弃
当使用synchronized关键字提供的内置锁时只要线程没有获得锁就会永远等待下去。 然而Lock接口提供了
boolean tryLock(long time, TimeUnit unit) throws InterruptedException该方法可以按照固定时间等待锁所以线程可以在获取锁超时时主动释放之前已经获得的所有的锁。
五、拓展 Java CPU 100%排查
见https://blog.csdn.net/u010648555/article/details/80721815