同步是指一个线程要等待另外一个线程执行完毕才会 继续执行的一种操作形式,虽然在一个程序中,使用同步可以保证资源共享操作的正确性,但是过多同步也会产生问题。
同步产生的问题
不同线程相互等待造成死锁
所谓的死锁,是指两个线程都在等待对方先完成,造成了程序的停滞状态。一般程序的死锁都是在程序运行时出现的。
范例:观察线程死锁
public class Book {
public synchronized void tell(Painting paint) { //同步方法
System.out.println("张三对李四说:把你的画给我,我就给你书,不给画不给书");
paint.get();
}
public synchronized void get() {
System.out.println("张三得到李四的画,开始认真欣赏"); //同步方法
}
}
public class Painting {
public synchronized void tell(Book book) { //同步方法
System.out.println("李四对张三说:把你的书给我,我就给你画,不给书不给画");
book.get();
}
public synchronized void get() {
System.out.println("张三得到李四的书,开始认真阅读"); //同步方法
}
}
public class DeadLock implements Runnable {
private Book book=new Book();
private Painting paint=new Painting();
public DeadLock() {
new Thread(this).start();
book.tell(paint);
}
@Override
public void run() {
paint.tell(book);
}
public static void main(String[] args) {
new DeadLock();
}
}
执行结果
张三对李四说:把你的画给我,我就给你书,不给画不给书
李四对张三说:把你的书给我,我就给你画,不给书不给画
程序处于相互等待状态,后续代码都不在执行
死锁一旦出现程序将进入等待状态并且不会向下继续执行。