侧边栏壁纸
  • 累计撰写 793 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

目 录CONTENT

文章目录

如何避免死锁

Dettan
2021-04-10 / 0 评论 / 0 点赞 / 158 阅读 / 402 字
温馨提示:
本文最后更新于 2022-07-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
1)加锁顺序(线程按照一定的顺序加锁)
package itheima.com; 
public class DeadLock {     
 public int flag = 1;     
 //静态对象是类的所有对象共享的     
 private static Object o1 = new Object(), o2 = new Object();     
 public void money(int flag) { 
   this.flag=flag; 
   if( flag ==1){ 
        synchronized (o1) {     
                try {     
                    Thread.sleep(500);     
                } catch (Exception e) {     
                    e.printStackTrace();     
                }     
                synchronized (o2) {     
                    System.out.println("当前的线程是"+ 
                        Thread.currentThread().getName()+" "+"flag的值"+"1");     
                }     
            }         
      }         
       if(flag ==0){ 
        synchronized (o2) {     
               try {     
                   Thread.sleep(500);     
               } catch (Exception e) {     
                   e.printStackTrace();     
               }     
               synchronized (o1) {     
                   System.out.println("当前的线程是"+ 
                       Thread.currentThread().getName()+" "+"flag的值"+"0");     
               }     
           }        
       } 
   }

public static void main(String[] args) {                
        final DeadLock td1 = new DeadLock();     
        final DeadLock td2 = new DeadLock();         
        td1.flag = 1;     
        td2.flag = 0;     
        //td1,td2都处于可执行状态,但JVM线程调度先执行哪个线程是不确定的。     
        //td2的run()可能在td1的run()之前运行     
        final Thread t1=new Thread(new Runnable(){ 
     public void run() { 
       td1.flag = 1;  
       td1.money(1); 
     }         
        }); 
        t1.start(); 
        Thread t2= new Thread(new Runnable(){ 
     public void run() { 
       // TODO Auto-generated method stub 
       try { 
         //让t2等待t1执行完 
         t1.join();//核心代码,让t1执行完后t2才会执行 
       } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
       } 
       td2.flag = 0; 
       td1.money(0); 
     }        
        }); 
        t2.start(); 
    }     
}

结果: 当前的线程是Thread-0 flag的值1 当前的线程是Thread-1 flag的值0
2. 获取锁时加超时时间.
线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁
if (lock.tryLock(5000, TimeUnit.MILLISECONDS)) {   
		System.out.println(tName + "获取到锁!");   
} else {   
		System.out.println(tName + "获取不到锁!");   
		return;   
}
0

评论区