关于解除死锁的例子

下面例子用到 Java 并发工具java.util.concurrent.locks 包里的 Lock 接口和 ReentrantLock 类,ReentrantLock 类实现了Lock的接口。Lock 有一个很有用的方法 tryLock 尝试获取锁,如果可以获取到返回true,否则返回false。

具体过程还是看代码吧:

package com.yao.thread;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class Resource1 {
	private String name;
	private int resourceCount;
	private Lock lock = new ReentrantLock();

	public Resource1(String name, int resourceCount) {
		this.name = name;
		this.resourceCount = resourceCount;
	}

	int doSome() {
		return ++resourceCount;
	}

	void cooperate(Resource1 resource) {
		while(true){
			boolean isGetMyLock = this.lock.tryLock();
			boolean isGetResourceLock = resource.lock.tryLock();
			try {
				if(isGetMyLock && isGetResourceLock){
					resource.doSome();
					System.out.printf("%s 整合了 %s 的资源。%n", this.name, resource.getName());
					break;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				if(isGetMyLock){
					this.lock.unlock();
				}
				
				if(isGetResourceLock){
					resource.lock.unlock();
				}
			}
			
		}
	}

	public String getName() {
		return this.name;
	}
}
public class NoDeadLockDemo {

	public static void main(String[] args) {
		final Resource1 rs1 = new Resource1("resource1", 10);
		final Resource1 rs2 = new Resource1("resource2", 20);

		Thread td1 = new Thread() {
			public void run() {
				for (int i = 0; i < 10; i++) {
					rs1.cooperate(rs2);
				}
			}
		};
		
		Thread td2 = new Thread(){
			public void run(){
				for(int i = 0 ; i < 10 ;i++){
					rs2.cooperate(rs1);
				}
			}
		};
		
		td1.start();
		td2.start();
	}

}



打印的结果为如下,没有了死锁的出现:

resource1 整合了 resource2 的资源。
resource1 整合了 resource2 的资源。
resource1 整合了 resource2 的资源。
resource1 整合了 resource2 的资源。
resource1 整合了 resource2 的资源。
resource2 整合了 resource1 的资源。
resource2 整合了 resource1 的资源。
resource2 整合了 resource1 的资源。
resource2 整合了 resource1 的资源。
resource2 整合了 resource1 的资源。
resource2 整合了 resource1 的资源。
resource2 整合了 resource1 的资源。
resource2 整合了 resource1 的资源。
resource2 整合了 resource1 的资源。
resource2 整合了 resource1 的资源。
resource1 整合了 resource2 的资源。
resource1 整合了 resource2 的资源。
resource1 整合了 resource2 的资源。
resource1 整合了 resource2 的资源。
resource1 整合了 resource2 的资源。




你可能感兴趣的:(死锁,例子,解除)