线程死锁
线程死锁产生原因
死锁示例:
画家和作家都同时需要纸和笔,但是,画家先拿到纸,作家先拿到笔。此时,两者都不愿意率先放弃手中的资源并希望得到对方的资源。
Pen:
package com.ycy7;
public class Pen {
}
Paper:
package com.ycy7;
public class Paper {
}
Resource:
package com.ycy7;
public class Resource {
private Pen pen;
private Paper paper;
public Resource() {
super();
// TODO Auto-generated constructor stub
}
public Resource(Pen pen, Paper paper) {
super();
this.pen = pen;
this.paper = paper;
}
public Pen getPen() {
return pen;
}
public void setPen(Pen pen) {
this.pen = pen;
}
public Paper getPaper() {
return paper;
}
public void setPaper(Paper paper) {
this.paper = paper;
}
}
Writer:
package com.ycy7;
public class Writer extends Thread {
private Resource resource;
public void prepare(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
Pen pen = resource.getPen();
synchronized (pen) {
System.out.println("作家获得笔!");
try {
Thread.sleep(1000*1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Paper paper = resource.getPaper();
synchronized (paper) {
System.out.println("作家获得纸!");
}
}
}
}
Painter:
package com.ycy7;
public class Painter extends Thread {
private Resource resource;
public void prepare(Resource resource) {
// TODO Auto-generated method stub
this.resource = resource;
}
@Override
public void run() {
Paper paper = resource.getPaper();
synchronized (paper) {
System.out.println("画家获得纸!");
Pen pen = resource.getPen();
synchronized (pen) {
System.out.println("画家获得笔!");
}
}
}
}
测试类:
package com.ycy7;
public class Test01 {
public static void main(String[] args) {
//创建笔和纸资源
Pen pen = new Pen();
Paper paper = new Paper();
Resource resource = new Resource(pen,paper);
//创建作家
Writer writer = new Writer();
writer.prepare(resource);
//创建画家
Painter painter = new Painter();
painter.prepare(resource);
//先启动作家线程
writer.start();
painter.start();
}
}
结果: