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();}
