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

转载 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并发与多线程(1) 死锁是什么

节选自《Java完全参考手册》(第8版) 需要避免的与多任务明确相关的特殊类型的错误是死锁——deadlock,当两个线程循环依赖一对同步对象时,会发生这种情况。例如,假设一个线程进入对象Y的监视...

黑马程序员 JAVASE——多线程安全(并发问题和死锁等)

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------ Ps:部分内容为黑马毕向东老师视频整理,非完全原创。Jdk1.5以后线程新...

Java--多线程Thread(实现,并发并行,同步死锁,单例,线程组池)

一、线程    线程是程序执行的一条路径, 一个进程中可以包含多条线程    多线程并发执行可以提高程序的效率, 可以同时完成多项工作 二、多线程并行和并发的区别    1、并行就是两个任务同时运行,...

Java多线程与并发(三)之死锁

android培训——我的java笔记,期待与您交流!死锁 过多的同步有可能出现死锁, 死锁的操作一般是在程序运行的时候才有可能出现。这就好比两个人相向开车堵了, 但是谁也不让谁,会一直堵下去。程...

黑马程序员————多线程概述、同步死锁、线程控制、并发访问

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 多线程概述、同步死锁、线程控制、并发访问 一、多线程的概述 ...
  • lgplf
  • lgplf
  • 2015年06月14日 20:59
  • 471

java 多线程学习笔记2-同步代码块,死锁

1、多线程-同步代码块:synchronized     当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步。     如...

J2SE学习笔记:多线程、单例模式延迟加载懒汉式同步、死锁问题

package cn.itcast.threaddemo; /** * 开启新线程两种方式: * 1.继承Thread类。在主线程中new 一个Thread子类对象,调用start()。 * 2...

Java菜鸟学习笔记--多线程篇(三):线程死锁

什么是死锁 一句话解释: 所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 一张图: ...

9. 多线程 Part 3 同步与死锁 --- 学习笔记

 9.6 同步与死锁       9.6.1 问题的产生       9.6.2 使用同步解决问题       9.6.3 死锁 9.7 线程操作案例 --- 生产者及消费者 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程学习(十)并发协作-死锁
举报原因:
原因补充:

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