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

如何避免死锁

Dettan
2021-04-10 / 0 评论 / 0 点赞 / 96 阅读 / 1,427 字
温馨提示:
本文最后更新于 2022-04-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
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

评论区