synchronized锁 很强大
一旦对象被锁定 不释放的情况下 其他对象都要等待
这就与可能产生一个死锁的问题
如 线程one 想拿资源a和b 线程two 也想拿资源a和b
但是one先拿了a two先拿了b 这时one和two都在等待对方先释放资源 这时就是死锁
死锁的效果
哲学家就餐问题
四个哲学家 每个人左右手都有一根筷子 同时拿到两根才能吃饭
如何解决死锁
1 礼让 —-> 产生时间差 按顺序吃
2 不要产生对象公用的问题
筷子:
public class Chopstick {
private int num;
public Chopstick(int num){
this.num = num;
}
public int getNum(){
return this.num;
}
}
哲学家:
public class Philosopher extends Thread{
private String pname;//哲学家姓名
private Chopstick left;//左手边的筷子
private Chopstick right;//右手边的筷子
private long time;//哲学家沉睡的时间 让每个人先睡一定的时间 睡的时间不同就能让程序执行
public Philosopher(String pname,Chopstick left,Chopstick right,long time){
this.pname = pname;
this.left = left;
this.right = right;
this.time = time;
}
public void run(){
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (left){
System.out.println(this.pname+"拿起了左手边的"+this.left.getNum()+"筷子");
synchronized (right){
System.out.println(this.pname+"拿起了右手边的"+this.right.getNum()+"筷子");
System.out.println(this.pname+"吃饭了");
}
}
}
}
主方法:
public static void main(String[] args){
Chopstick c1 = new Chopstick(1);
Chopstick c2 = new Chopstick(2);
Chopstick c3 = new Chopstick(3);
Chopstick c4 = new Chopstick(4);
Philosopher p1 = new Philosopher("哲学家a",c2,c1,0);
Philosopher p2 = new Philosopher("哲学家b",c3,c2,3000);
Philosopher p3 = new Philosopher("哲学家c",c4,c3,0);
Philosopher p4 = new Philosopher("哲学家d",c1,c4,3000);
p1.start();
p2.start();
p3.start();
p4.start();
}