关于解除死锁的例子

原创
2014/09/01 11:09
阅读数 120

下面例子用到 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 的资源。




展开阅读全文
打赏
0
1 收藏
分享
加载中
楼主 我试了一下 例子是对的! 不能靠看代码预测结果 哈哈,还是得亲手一试!
2015/07/02 17:35
回复
举报
楼主 tryLock 确实可以有效的避免死锁的出现,但是你这个例子写的不好.因为没有锁住.
可以吧trylock 提换成 lock一试!
2015/07/02 17:34
回复
举报
更多评论
打赏
2 评论
1 收藏
0
分享
返回顶部
顶部