了解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();
}
}
}
}
代码很简单,这里就对主要代码进行解析
- 想要形成死锁,至少要有两个资源,于是构造函数传入两个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();
}
}
运行:
如图,没有输出 (还以为会报错。。所以死锁后果很严重,是不会报错的)