多线程学习(十)并发协作-死锁

转载 2016年06月02日 09:39:24

转自:http://lavasoft.blog.51cto.com/62575/222074

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() + "获取了resourceB的锁!"); 
                        synchronized (resourceA) { 
                                System.out.println("write():" + Thread.currentThread().getName() + "获取了resourceA的锁!"); 
                                resourceA.value = a; 
                                resourceB.value = b; 
                        } 
                } 
        } 
}
 
下面死锁的情况发生了,真是难得一见啊:
 
 

java多线程:并发协作-死锁

线程发送死锁的可能性很小,即使看似可能发生死锁的代码,在运行时发送死锁的可能性也是小之又小。 发生死锁的原因一般是由两个对象的锁互相等待造成的。...
  • carl_jiang
  • carl_jiang
  • 2014年08月29日 16:45
  • 171

《java并发编程实战》读书笔记——避免死锁的发生

我们使用加锁机制来确保线程安全,但如果过度地使用加锁,则可能导致锁顺序死锁。当一个线程永远地持有一个锁,并且其他线程都尝试获得这个锁时,那么他们将永远被阻塞。 在数据库系统的设中考虑了检测死锁以及从...
  • Great_Smile
  • Great_Smile
  • 2015年03月25日 13:50
  • 825

并发和并行的区别 以及线程的死锁

1 并发的英文是 Concurrency,并行的英文是 Parallel,并发与并行是两个不同的概念。   并行是指在同一时刻,有多条指令在多个处理器上同时执行。 并发是指在同一时刻...
  • u010442009
  • u010442009
  • 2014年11月12日 10:47
  • 972

Mysql数据库并发插入死锁问题及处理方式

Mysql有很多坑,对Mysql多线程支持这块不是很熟的话就会莫名其妙地发生一些诡异的问题。多线程线程并发操作时最容易产生死锁问题。所以很多大数据的操作一般都采用NoSQL数据库方案来处理,或者读写分...
  • boonya
  • boonya
  • 2017年03月22日 15:47
  • 7128

java挑战高并发(9):死锁

当线程需要同时持有多个锁时,有可能产生死锁。考虑如下情形:       线程A当前持有互斥所锁lock1,线程B当前持有互斥锁lock2。接下来,当线程A仍然持有lock1时,它试图获取lock2,...
  • A1023824314
  • A1023824314
  • 2016年08月03日 17:00
  • 1405

Java 并发:线程间通信与协作

线程与线程之间不是相互独立的个体,它们彼此之间需要相互通信和协作,最典型的例子就是生产者-消费者问题。本文首先介绍 wait/notify 机制,并对实现该机制的两种方式——synchronized+...
  • justloveyou_
  • justloveyou_
  • 2017年02月08日 17:43
  • 3306

并发协作-死锁

线程发生死锁可能性很小,即使看似可能发生死锁的代码,在运行时发生死锁的可能性也是小之又小。   发生死锁的原因一般是两个对象的锁相互等待造成的。   在《Java线程:线程的同...
  • gaokewoo
  • gaokewoo
  • 2014年05月06日 09:35
  • 190

MySQL并发引起的死锁问题

PHP爱好者 2017-04-27 15:14 背景: 平台的某个数据库上面有近千个连接,每个连接对应一个爬虫,爬虫将爬来的数据放到cdb里供后期分析查询使用。前段时间经常出现cdb查询缓慢,c...
  • u011277123
  • u011277123
  • 2017年04月28日 11:14
  • 544

【java并发】线程技术之死锁问题

我们知道,使用synchronized关键字可以有效的解决线程同步问题,但是如果不恰当的使用synchronized关键字的话也会出问题,即我们所说的死锁。死锁是这样一种情形:多个线程同时被阻塞,它们...
  • eson_15
  • eson_15
  • 2016年05月29日 09:52
  • 4367

数据库Oracle,Mysal并发时经典常见的死锁原因及解决方法

1.    mysql都有什么锁   MySQL有三种锁的级别:页级、表级、行级。 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁...
  • u010963948
  • u010963948
  • 2017年02月13日 19:38
  • 839
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程学习(十)并发协作-死锁
举报原因:
原因补充:

(最多只允许输入30个字)