关于解除死锁的例子

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




转载于:https://my.oschina.net/jamaly/blog/308629

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值