同步的本质在于:一个线程等待另一个线程执行完毕后才可以继续执行。但是,现在相关的几个线程彼此之间都在等待着,那么就会造成死锁。
范例:死锁
package hhh.Test;
class Pen {
private String pen = "笔" ;
public String getPen() {
return pen;
}
}
class Book {
private String book = "本" ;
public String getBook() {
return book;
}
}
public class test {
private static Pen pen=new Pen();
private static Book book=new Book();
public static void main(String[] args){
Thread threadA=new Thread(new Runnable() {
@Override
public void run() {
synchronized (pen){
System.out.println("我有笔...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (book){
System.out.println("但是我还想要本子...");
}
}
}
});
threadA.setName("threadA");
threadA.start();
Thread threadB=new Thread(new Runnable() {
@Override
public void run() {
synchronized (book){
System.out.println("我有本子...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (pen){
System.out.println("但是我还想要书...");
}
}
}
});
threadB.setName("threadB");
threadB.start();
}
}
死锁一旦出现之后,整个程序就将中断执行,所以死锁属于严重性问题。过多的同步会造成死锁,对于资源的上锁一定要注意不要成"环"。
避免死锁:银行家算法