代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*
 * DESCRIPTION : 
 * USER : zhouhui
 * DATE : 2017/8/2 10:12
 */
public class DeadLockDemo {
    public static void main(String[] args) {
        //分别定义两个被锁的对象
        Entity entity1 = new Entity("entity1");
        Entity entity2 = new Entity("entity2");
        //定义两个线程,并设置不同的名字
        new Thread(new MyR(entity1,entity2),"Thread 1").start();
        new Thread(new MyR(entity2,entity1),"Thread 2").start();
    }
}
class MyR implements Runnable{
    private Entity entity1;
    private Entity entity2;
    public MyR(Entity entity1,Entity entity2){
        this.entity1 = entity1;
        this.entity2 = entity2;
    }
    public void run() {
        System.out.println(Thread.currentThread().getName() + "尝试获得"+entity1.getName()+"的锁");
        synchronized (entity1){//尝试获得第一个锁
            System.out.println(Thread.currentThread().getName() + "获得"+entity1.getName()+"的锁");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "尝试获得"+entity2.getName()+"的锁");
            synchronized (entity2){//尝试获得第二个锁
                System.out.println(Thread.currentThread().getName() + "获得"+entity2.getName()+"的锁");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
/**
 * 定义一个锁的对象,为了方便区分定义一个name区分对象
 */
class Entity{
    private String name;
    public Entity(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

打印结果:

1
2
3
4
5
6
Thread 1尝试获得entity1的锁
Thread 2尝试获得entity2的锁
Thread 1获得entity1的锁
Thread 2获得entity2的锁
Thread 2尝试获得entity1的锁
Thread 1尝试获得entity2的锁

本文转自 斯然在天边 51CTO博客,原文链接:http://blog.51cto.com/13172906/1952922,如需转载请自行联系原作者

Java的死锁的例子相关推荐

  1. java 线程死锁简单例子_java 多线程死锁详解及简单实例

    java 多线程死锁 相信有过多线程编程经验的朋友,都吃过死锁的苦.除非你不使用多线程,否则死锁的可能性会一直存在.为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2) ...

  2. java实现死锁简单例子,Java死锁的简单例子

    Java死锁的简单例子 两个线程互相占有对方需要的资源而不释放,便形成了死锁. 代码如下: Program.java /** * 程序类 * @author michael * */ public c ...

  3. Java多线程--死锁例子

    package qzy.thread.deadLock;/*** @描述模拟死锁** 形成死锁的四个必要条件是什么** 1.互斥条件:线程(进程)对于所分配到的资源具有排它性,即一个资源只能被一个线程 ...

  4. Java多线程学习四十:如何写一个必然死锁的例子

    死锁是什么?有什么危害? 什么是死锁 发生在并发中 首先你要知道,死锁一定发生在并发场景中.我们为了保证线程安全,有时会给程序使用各种能保证并发安全的工具,尤其是锁,但是如果在使用过程中处理不得当,就 ...

  5. java产生死锁的主要原因_详解java中产生死锁的原因及如何避免

    1. Java中导致死锁的原因 Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得锁L1,因为默认的锁申请操作都是阻塞的,所以线程T1和T2 ...

  6. java多线程--死锁

    1. Java中导致死锁的原因 Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得锁L1,因为默认的锁申请操作都是阻塞的,所以线程T1和T2 ...

  7. java volatile 死锁_Java 多线程:volatile 变量、happens-before 关系及内存一致性

    原标题:Java 多线程:volatile 变量.happens-before 关系及内存一致性 来源:ImportNew - paddx 更新 请参考来自 Jean-philippe Bempel ...

  8. 面试官:手写一个必然死锁的例子?一顿操作猛如虎。。

    来源:blog.csdn.net/xiewenfeng520/article/details/107230996 前言 只对死锁代码感兴趣的可以直接跳到第三小节 必然死锁示例,如果对死锁还不太了解的, ...

  9. java jstack 死锁_用jstack找死锁

    java死锁主要依靠jstack命令来查找. 检测jstack 先配置好jdk环境变量,打开一个终端命令行,输入jstack回车.如果看到如下的字样,说明jstack是可用的. Usage: jsta ...

最新文章

  1. Oracle 物理结构(六) 文件-数据文件
  2. BZOJ4373: 算术天才⑨与等差数列
  3. _ZNote_Chrom_插件_Chrom运行Android软件_APK
  4. js和css被屏蔽了,拦截器 Filter ,js、css、image等静态资源不被拦截解决方案
  5. swift2.2的新特性
  6. flink 异步io使用
  7. 【BCVP】实现基于 Redis 的消息队列
  8. 操作系统进程调度算法图解(FCFS、轮转、SPN、SRT、HRRN、反馈)
  9. springboot 插入返回id_Spring Boot实现分布式微服务开发实战系列(七)
  10. Yiic执行php脚本
  11. 3G牌照发放脚步渐近 三大运营商提速布局3G
  12. 高等数学第六版下册答案
  13. 联想y430完全拆机图解_联想Y430P笔记本拆机加内存和SSD图文教程
  14. SYN FLOOD WINCAP
  15. rgb转换 css 字体
  16. C++函数的定义与使用
  17. 明日之后到底要不要加营地?不加营地能玩吗?
  18. Windows XP SP3 IIS HTTP 500 - 内部服务器错误解决
  19. vscode的seting配置
  20. 【Java】浅谈Swing概况及简单窗口的构建

热门文章

  1. php函数间参数传递(值传递/引用传递)
  2. 《我也能做CTO之.程序员职业规划》新书出版推举
  3. 使用ABAP编程实现对微软Office Word文档的操作
  4. Centos 6.8 搭建owncloud 私有云盘
  5. VR医疗|全球首例“换头手术”成功了么?
  6. Alpha 冲刺报告(8/10)
  7. Ubuntu操作系统安装之开发人员必备
  8. MySQL 性能监控4大指标——第一部分
  9. 【iOS UIKit】UITableView属性及方法大全
  10. C# Keywords - is