多线程死锁问题

前天俺们谈到了加锁,但是在使用加锁的同时又会带来一个问题,就是死锁。
什么叫死锁?
所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
    
那么为什么会产生死锁呢?
1.因为系统资源不足。
2.进程运行推进的顺序不合适。    
3.资源分配不当。
             
学过操作系统的朋友都知道:产生死锁的条件有四个:
1.互斥条件:所谓互斥就是进程在某一时间内独占资源。
2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

例如:

死锁是因为多线程访问共享资源,由于访问的顺序不当所造成的,通常是一个线程锁定了一个资源A,而又想去锁定资源B;在另一个线程中,锁定了资源B,而又想去锁定资源A以完成自身的操作,两个线程都想得到对方的资源,而不愿释放自己的资源,造成两个线程都在等待,而无法执行的情况。

分析死锁产生的原因不难看出是由访问共享资源顺序不当所造成的,下面写一个造成线程死锁的例子,希望能对大家理解多线程死锁问题有进一步的理解!如果有人需要编写多线程的系统,当操作共享资源时一定要特别的小心,以防出现死锁的情况!

package com.ljq.test;public class RunnableTest implements Runnable {private int flag = 1;private Object obj1 = new Object(), obj2 = new Object();public void run() {System.out.println("flag=" + flag);if (flag == 1) {synchronized (obj1) {System.out.println("我已经锁定obj1,休息0.5秒后锁定obj2去!");   try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (obj2) {System.out.println("1");}}}if (flag == 0) {synchronized (obj2) {System.out.println("我已经锁定obj2,休息0.5秒后锁定obj1去!");   try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (obj1) {System.out.println("0");}}}}public static void main(String[] args) {RunnableTest run01 = new RunnableTest();RunnableTest run02 = new RunnableTest();run01.flag = 1;run02.flag = 0;Thread thread01 = new Thread(run01);Thread thread02 = new Thread(run02);System.out.println("线程开始喽!");   thread01.start();thread02.start();}
}

运行结果如下:

这样就产生了死锁,这是我们过多的使用同步而产生的。我们在java中使用synchonized的时候要考虑这个问题,如何解决死锁,大家可以从死锁的四个条件去解决,只要破坏了一个必要条件,那么我们的死锁就解决了。在java中使用多线程的时候一定要考虑是否有死锁的问题哦。

多线程学习(三)----死锁问题相关推荐

  1. C#多线程学习(三) 生产者和消费者

    C#多线程学习(三) 生产者和消费者 原文链接:http://kb.cnblogs.com/page/42530/ 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操 ...

  2. C#多线程学习(三) 生产者和消费者 (转载系列)——继续搜索引擎研究

    前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. ...

  3. Java多线程学习三十八:你知道什么是 CAS 吗

    CAS 简介 CAS 其实是我们面试中的常客,因为它是原子类的底层原理,同时也是乐观锁的原理,所以当你去面试的时候,经常会遇到这样的问题"你知道哪些类型的锁"?你可能会回答&quo ...

  4. Java多线程学习三十七:volatile 的作用是什么?与 synchronized 有什么异同

    volatile 是什么 首先我们就来介绍一下 volatile,它是 Java 中的一个关键字,是一种同步机制.当某个变量是共享变量,且这个变量是被 volatile 修饰的,那么在修改了这个变量的 ...

  5. Java多线程学习三十一:ThreadLocal 是用来解决共享资源的多线程访问的问题吗?

    ThreadLocal 是不是用来解决共享资源的多线程访问的. 这是一个常见的面试问题,如果被问到了 ThreadLocal,则有可能在你介绍完它的作用.注意点等内容之后,再问你:ThreadLoca ...

  6. Java多线程学习三十:ThreadLocal 适合用在哪些实际生产的场景中

    我们在学习一个工具之前,首先应该知道这个工具的作用,能带来哪些好处,而不是一上来就闷头进入工具的 API.用法等,否则就算我们把某个工具的用法学会了,也不知道应该在什么场景下使用.所以,我们先来看看究 ...

  7. Java多线程学习三:有哪几种实现生产者消费者模式的方法

    我们先来看看什么是生产者消费者模式,生产者消费者模式是程序设计中非常常见的一种设计模式,被广泛运用在解耦.消息队列等场景.在现实世界中,我们把生产商品的一方称为生产者,把消费商品的一方称为消费者,有时 ...

  8. java多线程学习三

    本章主要学习线程的静态方法 1.先忙先看一段代码: public class MyThread3 implements Runnable {static {System.out.println(&qu ...

  9. [转]C#多线程学习(三) 生产者和消费者

    前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. ...

  10. Java多线程学习三十九:CAS 有什么缺点?

    CAS 有哪几个主要的缺点. 首先,CAS 最大的缺点就是 ABA 问题. 决定 CAS 是否进行 swap 的判断标准是"当前的值和预期的值是否一致",如果一致,就认为在此期间这 ...

最新文章

  1. 2019-2020年人工智能产业发展深度报告
  2. 雷达篇(八)合成孔径雷达工作模式
  3. leetcode 搜索插入位置
  4. 更方便的函数回调——Lambda
  5. 妙用通配符证书发布多个安全站点
  6. python中threading模块中的Join类
  7. HTML5 开源游戏引擎 LayaAir
  8. MySQL可视化 Navicat for MySQL 字体调整
  9. 软考 系统架构设计师考试大纲
  10. 74cms v5.0.1 漏洞复现
  11. 《缠中说禅108课》29:转折的力度与级别
  12. 302重定向:302 Moved Temporarily
  13. adb命令模拟按键事件 KeyCode
  14. Unity Shader - Shader Compilation Target Levels 着色器编译目标级别
  15. https访问出现无法访问此网站
  16. 塑胶材料的各种特性,热塑性塑料详解
  17. pta 构造哈夫曼树-有序输入 优先队列做法
  18. 揭秘阿里、腾讯、字节跳动在家办公的区别
  19. 计算机故障维修要遵循什么原则,计算机故障排除原则和方法;
  20. WLAN无线适配器未连接

热门文章

  1. 追踪源码自定义负载均衡策略
  2. Bootstrap全局css样式_表单
  3. Nginx教程-日志配置
  4. python实例化类执行顺序_Python实例化class的执行顺序
  5. python寻找列表最大值最小值及其下标
  6. ubuntu在线安装和卸载libusb
  7. 常用贴片三极管参数于常见三极管型号对照表
  8. 158.5. manifests
  9. 在MonoTouch中正确而简单的使用 Sqlite 数据库
  10. Solr学习笔记——查询