文档章节

关于死锁的例子

yaokangjun
 yaokangjun
发布于 2014/09/01 00:13
字数 348
阅读 140
收藏 1
package com.yao.thread;

class Resource {
	private String name;
	private int resourceCount;

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

	synchronized int doSome() {
		return ++resourceCount;
	}

	synchronized void cooperate(Resource resource) {
		resource.doSome();
		System.out.printf("%s 整合了 %s 的资源。%n", this.name, resource.getName());
	}

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

public class DeadLockDemo {

	public static void main(String[] args) {
		final Resource rs1 = new Resource("resource1", 10);
		final Resource rs2 = new Resource("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();
	}

}

    上面的线程是td1在获取到资源rs1的锁后执行 rs1.cooperate(rs2) 方法,cooperate方法会尝试获得rs2的锁并且调用rs2的doSome()方法。但是这时rd2也开始执行了,它已经获取资源rs2的锁后执行rs2.cooperate(rs1)方法,同理cooperate方法会尝试获得rs1的锁并且调用rs1的doSome()方法;但是线程td1也已经获取了rs1的锁。所以出现了双方都获取了自己的锁相互等待着对方的锁。



© 著作权归作者所有

yaokangjun
粉丝 27
博文 62
码字总数 29408
作品 0
广州
程序员
私信 提问
线程同步——死锁

在实际编程中,死锁虽然不常见,但是如果遇到死锁便是致命的。接下来了解一下《操作系统》对于死锁产生条件的描述。 死锁产生的条件: (1)互斥条件:所谓互斥就是进程在某一时间内独占资源...

wjk_snail
2015/12/15
69
0
11-了解多线程所带来的安全风险

本节课来了解一个非常重要的问题,线程安全性问题。在了解线程安全性问题之前,我们先了解一下关于线程所带来的风险这个问题, 我们之前也提到过这么一回事,我们说,线程不光有它的优势,同...

G_66_hero
2018/12/31
0
0
从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
89
0
关于Java避免死锁的几种方式

首先,解释下线程。所谓线程,就是被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。在单线程程序下,我们总可以指出程序当前的运行位置。而对于多线程,就可以指出A...

dreamyoungman
2017/07/27
0
0
17-理解自旋锁,死锁与重入锁

本讲我们来了解我们之前所遇到的几个锁的概念,就是自旋锁、死锁、重入锁。 我们首先来看重入锁,也就是锁重入,什么意思呢?我们之前,我们用到的synchronized就是一个重入锁。那么,什么是...

G_66_hero
01/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JDBC+C3P0+DBCP 基本使用

1.概述 这篇文章主要说了JDBC的基本使用,包括Statement,PreparedStatement,JDBC的连接,Mysql创建用户创建数据表,C3P0的连接与配置,DBCP的连接与配置. 2.mysql的处理 这里的JDBC使用Mysql作为...

Blueeeeeee
54分钟前
5
0
MVC Linux下开发及部署

linux使用的是 Ubuntu 64 位 18.04.2 LTS 首先复制C:\Program Files (x86)\Embarcadero\Studio\20.0\PAServer 下 LinuxPAServer20.0.tar.gz 到 linux 目录下 运行链接编译程序 delphi环境配置......

苏兴迎
今天
9
0
3.控件及其属性

1.文本 2.按钮

横着走的螃蟹
今天
7
0
安装Genymotion模拟器慢的解决方案

第一步点击下载, C:\Users\Administrator\AppData\Local\Genymobile\genymotion.log 中搜索 ova 会发现这个文件 使用迅雷下载即可. 在 虚拟机中导入这个.ova 文件 即可安装...

chenhongjiang
今天
5
0
4. 彤哥说netty系列之Java NIO实现群聊(自己跟自己聊上瘾了)

你好,我是彤哥,本篇是netty系列的第四篇。 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识。 简介 上一章我们一起学习了Java中的BIO/NIO/AIO的故事,本章将带着大家一起使用纯纯的N...

彤哥读源码
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部