java基础之线程死锁

 线程死锁是指由线程同步(synchronized 关键字)引起的,线程同步规定了同一个对象的所有synchronized

关键修饰的方法或代码块在一个时刻只能有一个线程在执行其中的一个方法体。

 

线程:A , B  的run方法分别启动 M1( ) ,  M3( )

对象:[ Obj1,Obj2 ]  这两个对象又相互拥有对方

方法:[Obj1{ M1( Obj2. M4() ) , M2()}]  [Obj2{ M3( Obj1.M2() ) , M4()}  ] 方法前都有关键字 synchronized 修饰

 

当 线程A 开启M1()方法 ,对象A其他所有方法被锁,线程B 开启M3( )方法 ,对象B其他所有方法被锁,而方法M1()又调用线程B的M4() ,而M4()方法已被锁住,所以线程A 只能等待,同时 方法M3()又调用线程A的M2() ,而M2()方法已被锁住,所以线程B 只能等待,此时A在等待B,B在等待A,这样就死锁了。如同初恋的男孩女孩,如下就是这样一个例子:

package com.sail.utils.deadLock;

//月老很忙
public class YueLao {

	public static void main(String[] args) {
		cravenBoy boy=new cravenBoy();
		shyGirl girl=new shyGirl();
		//保证两个线程调用的是同一个对象
		boy.setGril(girl);
		girl.setBoy(boy);
		
		//分别启动男孩和女孩线程
		new Thread(boy).start();
		new Thread(girl).start();
	}

}

//胆小男
class cravenBoy implements Runnable{
	
	private shyGirl girl;
	
	public void setGril(shyGirl girl){
		this.girl=girl;
	}
	
	public synchronized  void sayLove(){
		System.out.println("sayLove()");
		//让女孩开心
		girl.sweat();
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public synchronized void happy(){
		System.out.println("happy()");
	}

	//线程调用body的sayLove()
	public void run() {
		sayLove();
	}
}

//害羞女
class shyGirl implements Runnable{
	
	private cravenBoy boy;
	
	public void setBoy(cravenBoy boy){
		this.boy=boy;
	}
	
	public synchronized void acceptLove(){
		System.out.println("acceptLove()");
		//让男孩高兴
		boy.happy();
	}
	
	public synchronized void sweat(){
		System.out.println("sweat()");
	}

	public void run() {
		acceptLove();
	}
}

 

 

你可能感兴趣的:(java基础)