我们有时候操作数据库的时候会遇到死锁,那么什么使死锁呢?它的一个比较官方的定义就是:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。我们也可以通过下面一个小故事来进行简单的理解。就是说吧有两个人他们在一起吃饭,但是呢,筷子不够,A这个人有一支筷子,B这个人也有一支筷子,加入A要吃饭的时候,B把筷子给了A,这样A就吃上了饭,同理B要吃饭的时候,A把筷子给了B,这样B也吃上了饭,如果要是这样的话,就没有我们什么事了,但是有一天,有一道菜非常好吃,A、B都想先吃,A向B拿筷子,B也先向A拿筷子。两人都不愿意把筷子给对方,那只能一直耗着,等着,那么我们就可以说他们两个死锁了。

那么如何使用java来编写一个死锁程序呢。简单来说就是在同步代码块中嵌套同步代码块,两个同步代码块应用了两个不同的锁。A线程的第一个同步代码块用到了锁A,第二个同步代码块用到了锁B。B线程第一个同步代码块用到了锁B,第二个同步代码块用到了锁A。这样当A线程运行的时候先用了锁A,还没有用到锁B的时候,B线程也启动了,用到了锁B,这时A线程要用锁B,然而这时B线程却已经占用了锁B,而B线程继续运行需要锁A,可是A线程已经占用了锁B,这样话,这两个线程就出现了死锁。示例代码如下:

package com.day05;

/**
* 死锁:就是同步代码块中嵌套另外一个同步代码块
*
* @author Administrator
*
*/
public class DeadLockDemo {
public static void main(String[] args) {
// 创建两个线程
DeadLockThread dt1 = new DeadLockThread(false);
DeadLockThread dt2 = new DeadLockThread(true);
// 启动线程
new Thread(dt1).start();
new Thread(dt2).start();
}
} class DeadLockThread implements Runnable {
// 标记变量
private boolean flag; public DeadLockThread(boolean flag) {
super();
this.flag = flag;
} public void run() {
// dt1线程执行该方法
if (flag) {
synchronized (ThreadLock.locka) { System.out.println("if locka!");
synchronized (ThreadLock.lockb) {
System.out.println("if lockb!");
}
}
} // dt2线程执行该方法
else {
synchronized (ThreadLock.lockb) {
System.out.println("else lockb!");
synchronized (ThreadLock.locka) {
System.out.println("else locka!");
}
}
}
}
} class ThreadLock {
static Object locka = new Object();
static Object lockb = new Object();
}

运行结果:

if locka!
else lockb!

这个时候程序就卡着不动了,也就死锁了。希望大家可以通过此示例了解死锁,应尽量在程序中避免死锁.

Java死锁的理解的更多相关文章

  1. 一文学会Java死锁和CPU 100% 问题的排查技巧

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在 ...

  2. 【性能优化】一文学会Java死锁和CPU100%问题的排查技巧

    原文链接: 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在实际的工作或者面试就有遇到过: 第一个问题:Java死锁如何排查和解决? 第二个问题:服 ...

  3. 实例详解 Java 死锁与破解死锁

    锁和被保护资源之间的关系 我们把一段需要互斥执行的代码称为临界区.线程在进入临界区之前,首先尝试加锁 lock(),如果成功,则进入临界区,此时我们称这个线程持有锁:否则呢就等待,直到持有锁的线程解锁 ...

  4. Java基础之理解Annotation(与@有关,即是注释)

    Java基础之理解Annotation 一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) ...

  5. Java 集合深入理解(8):AbstractSequentialList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天有点无聊,来学学 AbstractSequentialList 解解闷 吧! AbstractSequentialLi ...

  6. Java 集合深入理解(7):ArrayList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点美丽,学学 ArrayList 放松下吧! 什么是 ArrayList ArrayList 是 Java 集合 ...

  7. Java 集合深入理解(4):List<E> 接口

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 蓝瘦!香菇! 连着加班几天,醉了.学学 List 放松下! 在 Java 集合深入理解:Collection 中我们熟悉了 ...

  8. java线程安全理解

    java线程安全理解 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. ...

  9. java常量池理解

    String类两种不同的创建方式 String s1 = "zheng"; //第一种创建方式 String s2 = new String("junxiang" ...

随机推荐

  1. Odoo8在TreeView左上角增加自定义按钮以及通过继承生成自定义的View_Mode

    今天有网友在问怎么在TreeView左上角增加一个自定义的按钮,在查询Odoo 自带的模块,发现在purchase_requisition中有使用,并且此模块还应用到了自定义View_Mode的情况, ...

  2. Python 中实现装饰器时使用 @functools.wraps 的理由

    Python 中使用装饰器对在运行期对函数进行一些外部功能的扩展.但是在使用过程中,由于装饰器的加入导致解释器认为函数本身发生了改变,在某些情况下——比如测试时——会导致一些问题.Python 通过  ...

  3. Mvp快速搭建商城购物车模块

    代码地址如下:http://www.demodashi.com/demo/12834.html 前言: 说到MVP的时候其实大家都不陌生,但是涉及到实际项目中使用,还是有些无从下手.因此这里小编带着大 ...

  4. 如何在谷歌浏览器中查看Axure做的原型HTML

    Axure RP Pro可谓是非常方便.好用的一款软件,因为它不仅能绘制出详细的产品构思,也能生成浏览器格式的产品原型.但如果想把原型拿给客户查看,需要看产品画的原型图时,但是打不开的话就悲剧了.经常 ...

  5. 导入解析excel小结

    导入解析excel小结 控制器例子:

  6. Lomboz插件的介绍 下载 安装 问题

    http://www.blogjava.net/javaandcc/articles/251334.html Lomboz是Eclipse的一个主要的开源插件(open-source plug-in) ...

  7. [UIDevice currentDevice].model

    iPhone Simulator iPad Simulator iPod touch iPad iPhone  

  8. Android开发之用双缓冲技术绘图

    双缓冲技术主要用在画图,动画效果上,其原理就是:将资源先载入到缓冲区,然后再将缓冲区整个载入到View上面去. 双缓冲技术可以有效防止闪烁,提高显示质量. DrawView.java: package ...

  9. vue 父组件如何调用子组件的函数Methods

    答案就是使用ref即可. <countdown ref="countdown"></countdown> beforeDestroy () { // 切换页 ...

  10. Crypto++库安装、测试

    项目中需要使用到C++加密解密库,选择了Crypto++这个开源库,于是先安装并写一个小例子试试 一.下载 网址:http://www.cryptopp.com/#download 二.打开项目 下载 ...