A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗宽前 初级黑马   /  2013-2-26 16:38  /  1414 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如何解决多线程死锁??

4 个回复

倒序浏览
死锁是用来避免的,不是用来写的
避免死锁得先知道原理
不要轻易将一个同步写在另一个同步里面
回复 使用道具 举报
死锁这个的话属于逻辑错误了吧,只能说自已写的时候心里要有个心眼尽量避免了,解决的话个人认为没这回事,你都知道它要死锁了还不改代码呀
回复 使用道具 举报
2个线程同时开启 , 线程T1拿了1号锁进入以后,又发现一个需要2号锁才可以进入的方法,与此同时线程T2在线程T1拿了1号锁的时候遇到一个需要2号锁的方法,T2拿了2号锁之后,又发现需要1个需要1号锁的方法,结果2个线程都拿着他们各自目前需要的锁,争持不下,于是形成死锁,我之前也不太清楚,不过现在搞懂了,也是师兄给出的。

  1. public class 死锁 {


  2.         public static void main(String[] args) {
  3.                         Book b=new Book();
  4.                         Thread t1=new Thread(b);
  5.                         Thread t2=new Thread(b);
  6.                         t1.start();
  7.                         b.is=false;
  8.                         
  9.                         t2.start();
  10.         }

  11. }
  12. class Book implements Runnable{
  13.         int bookNo=1000;
  14.         boolean is=true;
  15.         Object obj=new Object();
  16.         public void run(){
  17.                 if(is){
  18.                 while(true){
  19.                         
  20.                         //T1进来进来 拿OBJ锁到show方法前,想开show方法但是没this锁
  21.                         synchronized(obj){
  22.                                         show();
  23.                         }
  24.                 }
  25.                 }
  26.                 else{
  27.                         while(true)
  28.                                 show();
  29.                         }
  30.                 }
  31.                
  32.         //t2也进来来走到show进去拿到show方法的this锁但是需要obj锁
  33.         synchronized void show(){
  34.                 synchronized(obj){
  35.                 if(bookNo>0)
  36.                 {
  37.                         try {
  38.                                 Thread.sleep(10);
  39.                         } catch (InterruptedException e) {
  40.                                 // TODO Auto-generated catch block
  41.                                 e.printStackTrace();
  42.                         }
  43.                         System.out.println(Thread.currentThread().getName()+"---"+bookNo--);
  44.                         }
  45.                 }
  46.         }
  47.         
  48.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 鼓励个

查看全部评分

回复 使用道具 举报
死锁属于逻辑思维不严密造成的逻辑错误,要避免死锁的发生。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马