多线程同步死锁问题

 

多线程同步为什么会产生死锁?

死锁产生原因:线程1锁住资源A等待资源B,线程2锁住B资源等待A资源,两个线程都在等待自己所需的资源,而这些资源被另外的线程锁住,这些线程你等我,我等你,谁也不愿意让出资源,造成死锁问题,程序停止运行。

 

举个现实生活中的例子理解死锁:

有两辆汽车,汽车1和汽车2,汽车1后备箱内装着汽车2启动需要的汽油,汽车2后背箱内装着汽车1启动所需的电瓶;但是汽油和电瓶都被锁住了,汽车1和汽车2的车主,都在等待对方打开后背箱的锁把自己所需要的资源给自己,就这样你等我,我等你,两辆汽车就在那停着谁走不了。

避免死锁问题出现的办法:

不要分别同步各个资源的操作代码块,而是统一放在一个同步块中

就是不要把汽油和电瓶分别锁起来,放在同一个箱子里用一把锁锁起来,两个车主都有这把锁的钥匙

 

 

死锁问题实例:

 

 

/**
 * 多线程死锁问题
 */
public class DeadLock implements Runnable  {

   public boolean flag=true;
   private static Object res1=new Object();   //资源1
   private static Object res2=new Object();   //资源2
   
    public void run() {
	
    	  if(flag){
    		  
    		  /*锁定资源res1*/
    		  synchronized(res1){
    			  System.out.println("锁住资源1,等待资源2.。。。");
    			  
    			  try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					
					e.printStackTrace();
				}
    	
    	       /*锁定资源res 2*/
    	       synchronized(res2){
    		  
    		      System.out.println("Complete.");
    	        }
    		  }
    	  
    	}else{
    		
    		/*锁定资源2*/
    		synchronized(res2){
    			System.out.println("锁住资源2,等待资源1。。。。。");
    		}
    		
    		        try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						
						e.printStackTrace();
					}
					//锁定资源res1
					 synchronized(res1){
						 System.out.println("Complete.");
					 }
    		}
    	  }
	
public static void main(String[] args) {
		
		
	DeadLock r1=new DeadLock();   //创建线程对象
	DeadLock r2=new DeadLock();
	
	r2.flag=false;
	
	Thread t1=new Thread(r1);  //创建线程
	Thread t2=new Thread(r2);
	
	t1.start();
	t2.start();

	}
	
	
	
	
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值