死锁

发表时间:2017-05-09 13:32:45 浏览量( 17 ) 留言数( 0 )

学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度


学习过程:

一、死锁

同步有可能会导致另一个问题,就是死锁。死锁是指两个线程,都相互等待对方释放,死锁有时是不可测知或避开的,我们应该应采取措施避免死锁的出现。

二、死锁的例子

当然,这是一个反面例子。

1、定义一个资源类,为了标识每个资源,该类只有一个属性,就是资源名称。代码如下:

public class Resource {
	
	private String Name;

	public String getName() {
		return Name;
	}

	public void setName(String name) {
		Name = name;
	}
}

2、定义一个资源使用类,该类将会使用到两个资源对象,都是先锁住第一个时,然后在企图锁定另外一个。代码如下:

  public class ResourceThread extends Thread{
	
	private String threadName;//线程名称
	
	private Resource rs1;
	private Resource rs2;
	
	public ResourceThread(String threadName,Resource rs1,Resource rs2){
		
		this.threadName=threadName;
		this.rs1=rs1;
		this.rs2=rs2;
		
	}
	
	public void run(){
		
		//
		System.out.println(threadName+"企图占有"+rs1.getName());
		synchronized (rs1) {
			System.out.println(threadName+"已经锁定了"+rs1.getName());
			
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			System.out.println(threadName+"企图占有"+rs2.getName());
			synchronized (rs2) {
				System.out.println(threadName+"已经锁定了"+rs2.getName());
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			System.out.println(threadName+"释放"+rs2.getName());
			
		}
		System.out.println(threadName+"释放"+rs1.getName());
		
	}

}

3、模拟,现在只有三个资源对象,三个线程对象,

线程一锁住资源一,其他占用资源二;

线程二锁住资源二,其他占用资源三;

线程三锁住资源三,其他占用资源一;

示意图如下:

attcontent/f73ab30a-d431-4259-a333-c722c175e790.png

代码实现如下:

 public class Run {
	
	public static void main(String[] args) {
		
		Resource resource1=new Resource();
		resource1.setName("资源一");
		
		Resource resource2=new Resource();
		resource2.setName("资源二");
		
		Resource resource3=new Resource();
		resource3.setName("资源三");
		
		ResourceThread thread1=new ResourceThread("线程一", resource1, resource2);
		ResourceThread thread2=new ResourceThread("线程二", resource2, resource3);
		ResourceThread thread3=new ResourceThread("线程三", resource3, resource1);
		
		thread1.start();
		thread2.start();
		thread3.start();
		
	}

}

结果是哪一个线程都不能正常结束,程序也就一直耗着。你也只能终止这个程序了。