死锁产生的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
示例:死锁实例
package cn.thread.lock; public class ThreadLock implements Runnable{ private static Object o1=new Object(), o2=new Object(); private int flag1=0; @Override public void run() { System.out.println("flag1=" + flag1); if(flag1==0){ synchronized (o1) { System.out.println(Thread.currentThread().getName()+"我已经锁定o1"); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o2) { System.out.println(Thread.currentThread().getName()+"我已经锁定o2"); } } } if(flag1==1){ synchronized (o2) { System.out.println(Thread.currentThread().getName()+"我已经锁定o2"); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o1) { System.out.println(Thread.currentThread().getName()+"我已经锁定o1"); } } } } public static void main(String[] args) { ThreadLock r=new ThreadLock(); ThreadLock r1=new ThreadLock(); r1.flag1=0; r.flag1=1; Thread t=new Thread(r); Thread t1=new Thread(r1); t1.setName("t1"); t.setName("t"); t1.start(); t.start(); } }
说明:1.一个资源每次只能被一个进程使用–》
` a.所以要使用 synchronized 关键字,保证一个资源被一个进程使用。
b.o1,o2一定要是静态的,保证是同一个资源。