博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java线程:并发协作-死锁
阅读量:4030 次
发布时间:2019-05-24

本文共 1551 字,大约阅读时间需要 5 分钟。

Java线程:并发协作-死锁
 
线程发生死锁可能性很小,即使看似可能发生死锁的代码,在运行时发生死锁的可能性也是小之又小。
 
发生死锁的原因一般是两个对象的锁相互等待造成的。
 
在《Java线程:线程的同步与锁》一文中,简述死锁的概念与简单例子,但是所给的例子是不完整的,这里给出一个完整的例子。
 
/**
* Java线程:并发协作-死锁
*
* @author Administrator 2009-11-4 22:06:13
*/
public
class Test {
        
public
static
void main(String[] args) {
                DeadlockRisk dead =
new DeadlockRisk();
                MyThread t1 =
new MyThread(dead, 1, 2);
                MyThread t2 =
new MyThread(dead, 3, 4);
                MyThread t3 =
new MyThread(dead, 5, 6);
                MyThread t4 =
new MyThread(dead, 7, 8);
                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
}
class MyThread
extends Thread {
        
private DeadlockRisk dead;
        
private
int a, b;
        MyThread(DeadlockRisk dead,
int a,
int b) {
                
this.dead = dead;
                
this.a = a;
                
this.b = b;
        }
        @Override
        
public
void run() {
                dead.read();
                dead.write(a, b);
        }
}
class DeadlockRisk {
        
private
static
class Resource {
                
public
int value;
        }
        
private Resource resourceA =
new Resource();
        
private Resource resourceB =
new Resource();
        
public
int read() {
                
synchronized (resourceA) {
                        System.out.println(
"read():" + Thread.currentThread().getName() +
"获取了resourceA的锁!");
                        
synchronized (resourceB) {
                                System.out.println(
"read():" + Thread.currentThread().getName() +
"获取了resourceB的锁!");
                                
return resourceB.value + resourceA.value;
                        }
                }
        }
        
public
void write(
int a,
int b) {
                
synchronized (resourceB) {
                        System.out.println(
"write():" + Thread.currentThread().getName() +
"获取了resourceA的锁!");
                        
synchronized (resourceA) {
                                System.out.println(
"write():" + Thread.currentThread().getName() +
"获取了resourceB的锁!");
                                resourceA.value = a;
                                resourceB.value = b;
                        }
                }
        }
}
 
下面死锁的情况发生了,真是难得一见啊:

转载地址:http://wcebi.baihongyu.com/

你可能感兴趣的文章
Linux中的进程
查看>>
学习python(1)——环境与常识
查看>>
学习设计模式(3)——单例模式和类的成员函数中的静态变量的作用域
查看>>
深度学习库安装与使用
查看>>
keras句子分类 keras_demo_for_sentence_classification (simplified version)
查看>>
MySQL for Windows 解压缩版配置安装
查看>>
MySQL必知必会(读书笔记)
查看>>
MySQL必知必会(读书笔记二)
查看>>
Pyhton、Numpy、Pandas排序小结
查看>>
pandas时间序列
查看>>
pandas时间序列频率处理
查看>>
绘图和可视化(matplotlib)
查看>>
绘图和可视化(pandas)
查看>>
绘图和可视化(seaborn)
查看>>
Vim日常使用
查看>>
计算机网络第一记:网络核心
查看>>
信息检索:基于知识图谱和深度学习的文本表示和搜索(Explicit and distributed semantics for text representation and retrieval)
查看>>
计算机网络第二记:协议层次
查看>>
计算机网络第三记:网络安全
查看>>
深度学习训练中如何处理NaNs
查看>>