14.4.3线程同步与与死锁----线程死锁

同步是指一个线程要等待另外一个线程执行完毕才会 继续执行的一种操作形式,虽然在一个程序中,使用同步可以保证资源共享操作的正确性,但是过多同步也会产生问题。
同步产生的问题
不同线程相互等待造成死锁
在这里插入图片描述
所谓的死锁,是指两个线程都在等待对方先完成,造成了程序的停滞状态。一般程序的死锁都是在程序运行时出现的。
范例:观察线程死锁

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

执行结果

张三对李四说:把你的画给我,我就给你书,不给画不给书
李四对张三说:把你的书给我,我就给你画,不给书不给画

程序处于相互等待状态,后续代码都不在执行
死锁一旦出现程序将进入等待状态并且不会向下继续执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值