【计算机原理】死锁是怎样形成的

了解synchronized同步锁可以参考
synchronized给并发操作加一把锁

网上那些背书式的理论知识我也记不住,我只知道一句话,你先把你的给我,我就把我的给你.

要想形成死锁,首当其冲的就是抢占资源

demo:

1.先建一个deadlocktest包 (习惯了在包下写demo…)

2.新建一个资源类Resource
包含一个由synchronized 修饰的同步方法

package deadlocktest;

public class Resource {
	private int cpu;
	public synchronized void printCpu() {//同步块->锁住的商店
		System.out.println(Thread.currentThread().getName()+":"+this.cpu++);
	}
}

3.新建实现Runnable接口的ThreadMy类

package deadlocktest;

public class ThreadMy implements Runnable{

	private Resource resource1;
	private Resource resource2;
	public ThreadMy(Resource resource1,Resource resource2){
		
		//1.两个资源
		this.resource1=resource1;
		this.resource2=resource2;
	}
	@Override
	public void run() {
		
		if (Thread.currentThread().getName().equals("ThreadA")) {
				synchronized (resource1) {//2.你一个
					try {
						Thread.sleep(1000);//休眠下让另一个线程有足够时间上锁
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					resource2.printCpu();
				}	
			
		}if (Thread.currentThread().getName().equals("ThreadB")) {
				synchronized (resource2) {//3.我一个
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					resource1.printCpu();
				}
		}
	}
}

代码很简单,这里就对主要代码进行解析

  1. 想要形成死锁,至少要有两个资源,于是构造函数传入两个Resource对象
    2.在线程run的时候,给ThreadA一个resource1的锁,给ThreadB一个resource2的锁
    3.sleep休眠是为了让另一个线程有足够时间上锁

4.新建main函数测试类

package deadlocktest;

public class DeadLockTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Resource resource1=new Resource();
		Resource resource2=new Resource();
		new Thread(new ThreadMy(resource1,resource2),"ThreadA").start();//传入相同的两个资源实例
		new Thread(new ThreadMy(resource1,resource2),"ThreadB").start();

	}

}

运行:
deadlockconsole
如图,没有输出 (还以为会报错。。所以死锁后果很严重,是不会报错的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值