文档章节

关于解除死锁的例子

yaokangjun
 yaokangjun
发布于 2014/09/01 11:09
字数 449
阅读 82
收藏 1

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




© 著作权归作者所有

上一篇: 使用 ReentrantLock
下一篇: 关于死锁的例子
yaokangjun
粉丝 26
博文 62
码字总数 29408
作品 0
广州
程序员
私信 提问
加载中

评论(2)

想不到好名字
楼主 我试了一下 例子是对的! 不能靠看代码预测结果 哈哈,还是得亲手一试!
想不到好名字
楼主 tryLock 确实可以有效的避免死锁的出现,但是你这个例子写的不好.因为没有锁住.
可以吧trylock 提换成 lock一试!
从FindBugs中学Java【五】

TLWTWOLOCKWAIT TLW: Wait with two locks held (TLWTWOLOCKWAIT) Waiting on a monitor while two locks are held may cause deadlock. Performing a wait only releases the lock on the o......

小紅
2015/04/12
0
0
数据库开发 - 事务单元测试

本次得分为:70.00/70.00, 本次测试的提交时间为:2016-10-08, 如果你认为本次测试成绩不理想,你可以选择再做一次。1单选(5分)事务的隔离性是指?得分/总分 A.一个事务内部的操作及使用的数...

抢小孩糖吃
2016/10/08
18
0
多线程学习(1)产生死锁的条件和解决办法

死锁概念及产生原理 概念:多个并发线程因争夺系统资源而产生相互等待的现象。 原理: 在多线程环境下,某些资源具有互斥性,当被一个线程占用后,其他线程无法获取该资源;而一个线程为了完...

太猪-YJ
03/29
0
0
C#线程系列讲座(5):同步技术之Monitor

本文为原创,如需转载,请注明作者和出处,谢谢! 上一篇:C#线程系列讲座(4):同步与死锁 在上一讲介绍了使用lock来实现线程之间的同步。实际上,这个lock是C#的一个障眼法,在C#编译器编译...

最美的回忆
2017/11/13
0
0
死锁、进程通信以及进程线程的区别

死锁、进程通信以及进程线程的区别 一、死锁   操作系统中有若干进程并发执行,它们不断申请、使用、释放系统资源,虽然系统的进程协调、通信机制会对它们进行控制,但也可能出现若干进程都...

八戒_o
2016/02/02
95
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql mysql常用的常用函数

1. 数学函数 函 数 作 用 ABS(x) 返回x的绝对值 CEIL(x),CEILIN(x) 返回不小于x的最小整数值 FLOOR(x) 返回不大于x的最大整数值 RAND() 返回0~1的随机数 RAND(x) 返回0~1的随机数,x值相同返...

edison_kwok
44分钟前
1
0
译:Spring Data Repository 不区分大小写查询

使用Spring Data Repository 不区分大小写查询 原文链接:https://www.baeldung.com/spring-data-case-insensitive-queries 作者:Shubhra Srivastava 译者:liululee 1. 概览 Spring Data ......

liululee
51分钟前
2
0
读书replay《maven实战》.1.20190526

前情提要 maven这个工具用了好久了,但是一直都用的迷迷糊糊的,没有对它进行过系统性的学习,只是知道一些常用的功能怎么实现,所以20190516这一天我从JD购买了徐晓斌老师所著的《maven实战...

wanxiangming
今天
2
0
真实项目案例实战——【状态设计模式】使用场景

什么是状态模式 状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。 状态模式应用场景 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根...

须臾之余
今天
2
0
Java 实现把字符串转换成整数【底层实现】

https://blog.csdn.net/zl18310999566/article/details/80263396

qimh
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部