转: http://blog.csdn.net/xiaoya629/archive/2010/04/23/5519538.aspx
当synchronized使用过多时,可能会造成死锁,那么死锁到底是怎么一回事呢。先看下面的代码,实现死锁:
//死锁的实现
class A
{
public void get(){
System.out.println("A说:我开始启动了,B,给我你的资源");
}
public void say(){
System.out.println("A获得资源");
}
}
class B
{
public void get(){
System.out.println("B说:我开始启动了,A,给我你的资源");
}
public void say(){
System.out.println("B获得资源");
}
}
class MyThread implements Runnable
{
public static A a = new A();
public static B b = new B();
public boolean flag = false;
public void run(){
if(flag){
synchronized(a){
a.get();
try{
Thread.sleep(500);
}catch(InterruptedException e){}
synchronized(b){ //此同步代码块在另一同步代码块里
a.say();
}
}
}else{
synchronized(b){
b.get();
try{
Thread.sleep(500);
}catch(InterruptedException e){}
synchronized(a){ //此同步代码块在另一同步代码块里
b.say();
}
}
}
}
}
public class Demo24
{
public static void main(String args[]){
MyThread mt1 = new MyThread();
MyThread mt2 = new MyThread();
mt1.flag=true;
mt2.flag=false;
Thread th1 = new Thread(mt1);
Thread th2 = new Thread(mt2);
th1.start();
th2.start();
}
}
以上代码由于synchronized的同步造成了死锁,死锁是两个或多个线程同时等待对方的完成,而程序无法继续执行。在解释代码前,首先要明白synchronized到底是怎么一回事。synchronized定义同步,那么同步的什么,什么和什么同步了?
首先,我们得知道,什么是锁。在java中,每一个对象都有一个内部锁,如果以方法或代码块用synchronized进行声明,那么对象的锁将保护整个方法或代码块,要调用这个方法或者执行这个代码块,必须获得这个对象的锁。而且,任何时候都只能有一个线程对象执行被保护的代码
在以上代码中,
在线程th1启动后,他就获得了a的锁,同时当其休眠完毕,求会申请获得b的锁,而此时,他的a锁没有放弃。
在线程th2启动后,他就获得了b的锁,同时当其休眠完毕,求会申请获得a的锁,而此时,他的b锁没有放弃。
两方都握有自己的锁不放弃,而同时申请另一方的锁,所以,此时就造成了死锁。
同步,同步的就是线程和对象,将线程和对象进行绑定,获取对象的锁。
注意:通过以上代码可以发现,死锁的必要条件是不放弃已有的锁,而同时申请新锁。所以,要想实现死锁,就会有synchronized的嵌套。
这样才能同时操作两个以上的锁,从而造成死锁。
分享到:
相关推荐
java多线程死锁预防机制研究,java多线程死锁预防机制研究
关于Oracle数据库死锁问题的研究与讨论
Java的synchronized关键字用来进行线程同步操作,然而这在使用中经常会遇到一些问题,这里我们就来详解Java中synchronized关键字的死锁和内存占用问题:
基础理论知识,描述lock和synchronized的区别和基础的理论,其中还有死锁等基础概念。
Oracle数据库死锁问题研究.pdf
论文研究-制造系统中的死锁问题.pdf, 介绍了制造系统中的死锁问题,特点及控制策略.总结了近十年来制造系统中死锁问题的研究成果,将死锁问题的研究方法,按照建模方法进行...
在BOM数据的建立过程中存在一种造成MRP计算死循环的数据死锁现象,在分析BOM数据复杂性和描述BOM数据要求的基础上,对BOM数据管理中出现的数据死锁恶性问题作了深入分析,并提出基于深度优先和宽度优先搜索技术的BOM...
从进程同步的概念可以知道,当并发进程需要竞争使用资源或需要相互协作向前推进时,如果不采取同步措施,或同步措施不恰当,则很容易导致并发进程不能向前推进而陷入僵局,即死锁现象。死锁是发生在一组相互竞争或...
java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁...
设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。即设计一个能安排哲学家正常生活的程序。 3.2 问题描述 可能出现死锁问题,因为...
操作系统实验六:死锁问题实验报告。...从而进一步加深对于死锁问题的理解。掌握解决死锁问题的几种算法的编程和调试技术。练习怎样构造管程和条件变量,利用管程机制来避免死锁和饥俄问题的发生。
煤矿监控系统组态软件客观上要求...论文分析了煤矿组态软件体系结构,论述了该软件多线程死锁的原因,研究了具有优先级的多线程排队机制和调度机制,并利用Java语言编程实现,解决了矿用组态软件的死锁问题,达到预期目的。
查询sql的死锁进程,查找并杀死。解决生产数据库中卡死的现象。postgresql查询死锁以及杀死死锁进程sql
:介绍了I2C总线的基本原理,详细分析了I2C总线死锁现象产生的原因,提出了总线死锁恢复的各 种解决方法。并就每一种方法进行了仔细的研究,比较了各种方法的优点以及局限性,对I2C总线可用性设计提 出了指导。
实验二:死锁的检测和预防.doc
这个课件有关进程死锁的检测和解除,能帮助你更好的学习和理解死锁这一知识点
死锁详解,详细的为你讲解什么事死锁,如何克服死锁。
一、数据库死锁的现象 程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。 二、死锁的原理 当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提 交,另一条对于这一列...
死锁检测源代码
oracle死锁问题查询代码,仅供参考,有问题大家一起交流