java 多线程 实现死锁问题


/**
 * @author 杨宁
 *死锁问题:
 *创建两个线程或多个线程他们共享两个或多个同一个对象(一个对象就是一把锁)
 *两个线程在执行时各自占用对方的对象锁,等待对方归还各自的所需的锁,从而进入一种僵持状态
 */
public class Sisuo {

	public static void main(String[] args) {
		One one = new One();
		Two two = new Two();
		Thread t1=new Thread(new A(one,two));
		Thread t2=new Thread(new B(one,two));
		t1.start();
		t2.start();

	}

}
class A implements Runnable{
	One one;
	Two two;

	public A(One one, Two two) {
		super();
		this.one = one;
		this.two = two;
	}

	@Override
	public void run() {
		//线程A占用锁one
		synchronized (one) {
			//为保证一定会出现死锁让其睡一秒钟
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("A对象执行one");
			//等待线程B将two锁归还
			synchronized (two) {
				System.out.println("A对象执行two");
			}
		}
			}
	}
class B implements Runnable{
	One one;
	Two two;

	public B(One one, Two two) {
		super();
		this.one = one;
		this.two = two;
	}

	@Override
	public void run() {
		//线程B占用锁two
		synchronized (two) {
			System.out.println("B对象执行two");
			//等待线程A将one锁归还
			synchronized (one) {
				System.out.println("B对象执行one");
				
			}
			
		}
		
	}
	
}
class One{
	
}
class Two{
	
}





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值