多线程学习(三)----死锁问题
多线程死锁问题
前天俺们谈到了加锁,但是在使用加锁的同时又会带来一个问题,就是死锁。
什么叫死锁?
所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
那么为什么会产生死锁呢?
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中使用多线程的时候一定要考虑是否有死锁的问题哦。
多线程学习(三)----死锁问题相关推荐
- C#多线程学习(三) 生产者和消费者
C#多线程学习(三) 生产者和消费者 原文链接:http://kb.cnblogs.com/page/42530/ 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操 ...
- C#多线程学习(三) 生产者和消费者 (转载系列)——继续搜索引擎研究
前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. ...
- Java多线程学习三十八:你知道什么是 CAS 吗
CAS 简介 CAS 其实是我们面试中的常客,因为它是原子类的底层原理,同时也是乐观锁的原理,所以当你去面试的时候,经常会遇到这样的问题"你知道哪些类型的锁"?你可能会回答&quo ...
- Java多线程学习三十七:volatile 的作用是什么?与 synchronized 有什么异同
volatile 是什么 首先我们就来介绍一下 volatile,它是 Java 中的一个关键字,是一种同步机制.当某个变量是共享变量,且这个变量是被 volatile 修饰的,那么在修改了这个变量的 ...
- Java多线程学习三十一:ThreadLocal 是用来解决共享资源的多线程访问的问题吗?
ThreadLocal 是不是用来解决共享资源的多线程访问的. 这是一个常见的面试问题,如果被问到了 ThreadLocal,则有可能在你介绍完它的作用.注意点等内容之后,再问你:ThreadLoca ...
- Java多线程学习三十:ThreadLocal 适合用在哪些实际生产的场景中
我们在学习一个工具之前,首先应该知道这个工具的作用,能带来哪些好处,而不是一上来就闷头进入工具的 API.用法等,否则就算我们把某个工具的用法学会了,也不知道应该在什么场景下使用.所以,我们先来看看究 ...
- Java多线程学习三:有哪几种实现生产者消费者模式的方法
我们先来看看什么是生产者消费者模式,生产者消费者模式是程序设计中非常常见的一种设计模式,被广泛运用在解耦.消息队列等场景.在现实世界中,我们把生产商品的一方称为生产者,把消费商品的一方称为消费者,有时 ...
- java多线程学习三
本章主要学习线程的静态方法 1.先忙先看一段代码: public class MyThread3 implements Runnable {static {System.out.println(&qu ...
- [转]C#多线程学习(三) 生产者和消费者
前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. ...
- Java多线程学习三十九:CAS 有什么缺点?
CAS 有哪几个主要的缺点. 首先,CAS 最大的缺点就是 ABA 问题. 决定 CAS 是否进行 swap 的判断标准是"当前的值和预期的值是否一致",如果一致,就认为在此期间这 ...
最新文章
- 2019-2020年人工智能产业发展深度报告
- 雷达篇(八)合成孔径雷达工作模式
- leetcode 搜索插入位置
- 更方便的函数回调——Lambda
- 妙用通配符证书发布多个安全站点
- python中threading模块中的Join类
- HTML5 开源游戏引擎 LayaAir
- MySQL可视化 Navicat for MySQL 字体调整
- 软考 系统架构设计师考试大纲
- 74cms v5.0.1 漏洞复现
- 《缠中说禅108课》29:转折的力度与级别
- 302重定向:302 Moved Temporarily
- adb命令模拟按键事件 KeyCode
- Unity Shader - Shader Compilation Target Levels 着色器编译目标级别
- https访问出现无法访问此网站
- 塑胶材料的各种特性,热塑性塑料详解
- pta 构造哈夫曼树-有序输入 优先队列做法
- 揭秘阿里、腾讯、字节跳动在家办公的区别
- 计算机故障维修要遵循什么原则,计算机故障排除原则和方法;
- WLAN无线适配器未连接