简单死锁的例子
两个线程A,B 分别访问资源a,b 。A的访问的顺序是a,b。B的访问的顺序是b,a。两者互相等待形成死锁
哲学家问题
四个哲学家他的左右都有一只筷子只用一个哲学家拿起一双筷子才能吃饭,一种死锁的情况四个人同时都拿起一只筷子,
代码
哲学家Philosopher:
package my.Philosopher;
public class Philosopher extends Thread{
private String pname;
private Chopsticks left;
private Chopsticks right;
public Philosopher(String pname,Chopsticks left,Chopsticks right)
{
this.pname=pname;
this.left=left;
this.right=right;
}
public void run()
{
synchronized (left)
{
System.out.println("哲学家" + this.pname + "拿起左边的第" + left.getNum() + "筷子");
synchronized (right)
{
System.out.println("哲学家" + this.pname + "拿起右边的第" + this.right.getNum() + "筷子");
}
System.out.println("哲学家" +this.pname+"吃完了");
}
}
}
筷子类Chopsticks:
package my.Philosopher;
public class Chopsticks {
private int num;
public Chopsticks(int num)
{
this.num=num;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
主类
package my.Philosopher;
public class Main {
public static void main(String[] args) {
Chopsticks chopsticks1 =new Chopsticks(1);
Chopsticks chopsticks2 =new Chopsticks(2);
Chopsticks chopsticks3 =new Chopsticks(3);
Chopsticks chopsticks4 =new Chopsticks(4);
Philosopher p1=new Philosopher("a",chopsticks1,chopsticks2);
Philosopher p2=new Philosopher("b",chopsticks3,chopsticks2);
Philosopher p3=new Philosopher("c",chopsticks4,chopsticks3);
Philosopher p4=new Philosopher("d",chopsticks1,chopsticks4);
p1.start();
p2.start();
p3.start();
p4.start();
}
}
运行截图:
解决死锁的方法— 产生时间差
改写代码
哲学家Philosopher:
package my.Philosopher;
public class Philosopher extends Thread{
private String pname;
private Chopsticks left;
private Chopsticks right;
private Long time;
public Philosopher(String pname,Chopsticks left,Chopsticks right,Long time)
{
this.pname=pname;
this.left=left;
this.right=right;
this.time=time;
}
public void run()
{
try {
Thread.sleep(this.time);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (left)
{
System.out.println("哲学家" + this.pname + "拿起左边的第" + left.getNum() + "筷子");
synchronized (right)
{
System.out.println("哲学家" + this.pname + "拿起右边的第" + this.right.getNum() + "筷子");
}
System.out.println("哲学家" +this.pname+"吃完了");
}
}
}
主类
package my.Philosopher;
public class Main {
public static void main(String[] args) {
Chopsticks chopsticks1 =new Chopsticks(1);
Chopsticks chopsticks2 =new Chopsticks(2);
Chopsticks chopsticks3 =new Chopsticks(3);
Chopsticks chopsticks4 =new Chopsticks(4);
Philosopher p1=new Philosopher("a",chopsticks1,chopsticks2,0L);
Philosopher p2=new Philosopher("b",chopsticks3,chopsticks2,3000L);
Philosopher p3=new Philosopher("c",chopsticks4,chopsticks3,9000L);
Philosopher p4=new Philosopher("d",chopsticks1,chopsticks4,12000L);
p1.start();
p2.start();
p3.start();
p4.start();
}
}
产生线程的时间差,每个线程按照给定时间运行,避免死锁