死锁:过多的同步可能造成相互不释放资源* 从而相互等待,一般发生于同步中持有多个对象的锁
package com.lzy.syn;
/**
* 死锁:过多的同步可能造成相互不释放资源
* 从而相互等待,一般发生于同步中持有多个对象的锁
* @author Administration
*
*/
public class eDeadLock02 {
public static void main(String[] args) {
Burn b1=new Burn(1,"小明");
Burn b2=new Burn(0,"小刚");
new Thread(b1).start();
new Thread(b2).start();
}
}
//扫描仪
class Scanner{
}
//刻录机
class CDWriter{
}
//刻录
class Burn implements Runnable{
int choice;
String name;
public Burn(int choice, String name) {
super();
this.choice = choice;
this.name = name;
}
static Scanner scanner=new Scanner();
static CDWriter cdwrite=new CDWriter();
@Override
public void run() {
work();
}
public void work() {
if(choice==0) {
synchronized(scanner) {
System.out.println("扫描仪扫描"+this.name);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(cdwrite) {
System.out.println("刻录机刻录"+this.name);
}
}
}
else {
synchronized(cdwrite) {
System.out.println("刻录机刻录"+this.name);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(scanner) {
System.out.println("扫描仪扫描"+this.name);
}
}
}
}
}
代码主要意思就是小明小刚两个人都需要用扫描仪和刻录机进行扫描刻录,而小刚占用扫描仪,小明占用了刻录机,此时两个进程都被阻塞,双方都希望对方能释放出自己是所需要的资源,但他们都因为不能获得自己所需的资源继续运行,从而无法释放自己占有的资源,并且一直处于这样的僵持状态而形成死锁
若要避免死锁,只需避免“锁套锁”即可,
package com.lzy.syn;
/**
* 死锁:过多的同步可能造成相互不释放资源
* 从而相互等待,一般发生于同步中持有多个对象的锁
* @author Administration
*
*/
public class eDeadLock02 {
public static void main(String[] args) {
Burn b1=new Burn(1,"小明");
Burn b2=new Burn(0,"小刚");
new Thread(b1).start();
new Thread(b2).start();
}
}
//扫描仪
class Scanner{
}
//刻录机
class CDWriter{
}
//刻录
class Burn implements Runnable{
int choice;
String name;
public Burn(int choice, String name) {
super();
this.choice = choice;
this.name = name;
}
static Scanner scanner=new Scanner();
static CDWriter cdwrite=new CDWriter();
@Override
public void run() {
work();
}
public void work() {
if(choice==0) {
synchronized(scanner) {
System.out.println("扫描仪扫描"+this.name);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// synchronized(cdwrite) {
// System.out.println("刻录机刻录"+this.name);
// }
}
synchronized(cdwrite) {
System.out.println("刻录机刻录"+this.name);
}
}
else {
synchronized(cdwrite) {
System.out.println("刻录机刻录"+this.name);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// synchronized(scanner) {
// System.out.println("扫描仪扫描"+this.name);
// }
}
synchronized(scanner) {
System.out.println("扫描仪扫描"+this.name);
}
}
}
}