Java多线程死锁,java多线程解决死锁几种方法

  Java多线程死锁,java多线程解决死锁几种方法

  00-1010 1.什么是死锁2。死锁的原因3。死锁1的演示。同步2。四号锁。如何看待死锁1?使用jps命令查找运行程序的pid2,使用jstack查看堆栈信息。

  00-1010死锁是指两个或两个以上的进程在执行过程中争夺资源或互相通信而导致的阻塞现象。如果没有外力,他们就无法前进。此时,系统处于死锁状态或系统出现死锁。这些总是互相等待的进程称为死锁进程。

  00-1010 1.互斥条件:指进程独占使用分配的资源,即一个资源在一定时间内只被一个进程占用。如果此时有其他进程请求资源,请求者只能等待,直到占用资源的进程被释放。

  2.请求和保持条件:它意味着一个进程已经保持了至少一个资源,但是它提出了一个新的资源请求,并且这个资源已经被其他进程占用。此时,发出请求的进程会阻塞,但它仍然会占用已经获得的其他资源。

  3.非剥夺条件:指进程已经获得的资源,在用完之前不能被剥夺,用完之后才能自行释放。

  4.循环等待条件:发生死锁时,必须有一个循环链的资源进程——,即进程集{P0,P1,P2,Pn}正在等待P1占用的一个资源;P1正在等待被P2占领的资源,Pn正在等待已经被P0占用的资源。

  

目录

 

  

一、什么是死锁

导入龙目岛。数据;@ data public class Studnet { private String name;} public static void main(String[]args){ Studnet stu 1=new Studnet();stu 1 . set name( stu 1 );Studnet stu 2=new Studnet();stu 2 . set name( stu 2 );new Thread(()-{//lock stu 1 synchronized(stu 1){ system . out . println( Thread: Thread . current Thread()。getName(),持有: stu 1 . getName());Try {//因为线程运行是原生方法,所以我们增加线程睡眠和死锁概率TimeUnit。seconds . sleep;} catch(interrupted exception e){ e . printstacktrace();}//lock stu 2 synchronized(stu 2){ system . out . println( thread: thread . current thread()。getName(),持有: stu 2 . getName());} } }, t1 )。start();new Thread(()-{//lock stu 2 synchronized(stu 2){ system . out . println( Thread: Thread . current Thread()。getName(),持有: stu 2 . getName());Try {//因为线程运行是原生方法,所以我们增加线程睡眠和死锁概率TimeUnit。seconds . sleep;} catch(interrupted exception e){ e . printstacktrace();}//lock stu 1 synchronized(stu 1){ system . out . println( thread: thread . current thread()。getName(),持有: stu 1 . getName());

 

   } } },"t2").start(); }

 

  

 

  

2、lock

 public static void main(String[] args) { Lock lock1=new ReentrantLock(); Lock lock2=new ReentrantLock(); new Thread(()->{ //加锁lock1 lock1.lock(); try { System.out.println("线程:"+Thread.currentThread().getName()+",持有:"+"lock1"); try { //由于线程运行是native方法,我们增加线程睡眠,增加死锁概率 TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } //加锁lock2 lock2.lock(); try { System.out.println("线程:"+Thread.currentThread().getName()+",持有:"+"lock2"); }finally { //释放lock2 lock2.unlock(); } }finally { //释放lock1 lock1.unlock(); } },"t1").start(); new Thread(()->{ lock2.lock(); try { System.out.println("线程:"+Thread.currentThread().getName()+",持有:"+"lock2"); try { //由于线程运行是native方法,我们增加线程睡眠,增加死锁概率 TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } lock1.lock(); try { System.out.println("线程:"+Thread.currentThread().getName()+",持有:"+"lock1"); }finally { lock1.unlock(); } }finally { lock2.unlock(); } },"t2").start(); }

 

  

 

  

四、如何查看死锁

 

  

1、使用jps命令找到运行程序的pid

jps

 

  

 

  

 

  

2、jstack查看栈信息

jstack pid

 

  

 

  发现了一个死锁

  

 

  重点摘要,t1、t2线程,交叉持有锁,等待对方资源。

  

"t2":- waiting to lock <0x000000076b6f8428> - locked <0x000000076b6f8468>#t2 等待锁0x000000076b6f8428,持有0x000000076b6f8468"t1":- waiting to lock <0x000000076b6f8468> - locked <0x000000076b6f8428>#t1 等待锁0x000000076b6f8468,持有0x000000076b6f8428

 

  

 

  到此这篇关于java线程之死锁的文章就介绍到这了,更多相关java线程之死锁内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: