死锁:

概念:

所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用。它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 因为资源占用是相互排斥的。当某个进程提出申请资源后。使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续执行。这就产生了一种特殊现象:死锁。





死锁发生的条件:

1.相互排斥条件:一个资源每次仅仅能被一个线程使用

2.不可抢占条件(不剥夺条件):当前进程锁获得的资源,在未结束前,不能强行剥夺

3.占有且申请条件(请求与保持条件):一个进程已拥有一定的资源,又想申请别的资源,但对自己的资源又不放弃

4.循环条件:若干进程之间形成一种头尾相接的循环等待资源的关系





一般什么时候出现?  同步中嵌套同步

造一个死锁出来:

class Test2 implements Runnable
{
private boolean flag;
Test2(boolean flag )
{
this.flag = flag;
}
@Override
public void run()
{
// TODO Auto-generated method stub
if (flag)
{
synchronized (MyLock.locka)
{
System.out.println(Thread.currentThread().getName()+" if locka");
synchronized (MyLock.lockb)
{
System.out.println(Thread.currentThread().getName()+" if lockb");
}
}
}
else
{
synchronized (MyLock.lockb)
{
System.out.println(Thread.currentThread().getName()+" else lockb");
synchronized (MyLock.locka)
{
System.out.println(Thread.currentThread().getName()+" else locka");
}
}
}
}
} class MyLock
{
static Object locka = new Object();
static Object lockb = new Object();
} public class DieLockTest
{
public static void main(String[] args)
{
Thread t1 = new Thread(new Test2(true));
Thread t2 = new Thread(new Test2(false)); t1.start();
t2.start(); }
}

将之前验证同步函数的锁是this的程序也弄成死锁:

class Test1 implements Runnable
{
private static int num = 500;
Object obj = new Object();
boolean flag = true;
public void run ()
{
if (flag)
{
while (true)
{
synchronized (obj)//锁是obj
{
show ();//锁是this
}
}
}
else
{
while (true)
{
show();
}
}
}
public synchronized void show ()// 锁是 this
{
synchronized (obj)//锁是 obj
{
if (num >= 0)
{
try
{
Thread.sleep(20);
}
catch (Exception e)
{
// TODO: handle exception
System.out.println(e.toString());
}
System.out.println(Thread.currentThread().getName()+">>--code-- "+num--);
}
}
}
} public class DieLock
{
public static void main (String[] args)
{
Test1 t = new Test1();
Thread a = new Thread(t);
Thread b = new Thread(t); a.start();
try
{
Thread.sleep(20);
}
catch (Exception e)
{
// TODO: handle exception
}
t.flag = false;
b.start(); }
}

死锁的预防:

死锁的预防是保证系统不进入死锁状态的一种策略。

知道了死锁发生的条件,要避免死锁就要从打破条件入手。

点击打开链接

Java---16---多线程---死锁的更多相关文章

  1. java中多线程产生死锁的原因以及解决意见

    1.  java中导致死锁的原因 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,而该资源又被其他线程锁定,从而导致每一个线程都得等其它线程释放其锁定的资源,造成了所有线程都无法正常结 ...

  2. Java 多线程 - 死锁deadlock产生原因+避免方法

    ref: java中产生死锁的原因及如何避免 https://blog.csdn.net/m0_38126177/article/details/78587845 java如何避免死锁 http:// ...

  3. java多线程--死锁

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

  4. 沉淀再出发:再谈java的多线程机制

    沉淀再出发:再谈java的多线程机制 一.前言 自从我们学习了操作系统之后,对于其中的线程和进程就有了非常深刻的理解,但是,我们可能在C,C++语言之中尝试过这些机制,并且做过相应的实验,但是对于ja ...

  5. java之多线程 二

    线程的生命周期: 当线程被创建并被启动时,它既不是一启动就进入了执行状态,在线程的生命周期中,它要经过new(新建),就绪(Runnable),运行(Running),阻塞(Blocked),dead ...

  6. Java的多线程机制系列:(一)总述及基础概念

    前言 这一系列多线程的文章,一方面是个人对Java现有的多线程机制的学习和记录,另一方面是希望能给不熟悉Java多线程机制.或有一定基础但理解还不够深的读者一个比较全面的介绍,旨在使读者对Java的多 ...

  7. Java基础--多线程的方方面面

    1,什么是线程?线程和进程的区别是什么? 2,什么是多线程?为什么设计多线程? 3,Java种多线程的实现方式是什么?有什么区别? 4,线程的状态控制有哪些方法? 5,线程安全.死锁和生产者--消费者 ...

  8. Java的多线程(上)

    多线程的优点和必要性是不言而喻的. 三种方法实现多线程 1. 继承Thread class A extends Thread{ public void run() {...} } 使用时, new A ...

  9. java复习-多线程

    和线程之间的关系: 进程:进程是程序的一次动态执行过程,他经理了代码加载,执行到执行完毕的一个完整过程,这个过程也是进程本身从产生,发展到最终消亡的过程. 线程:线程是实现并发机制的一种有效手段,进程 ...

  10. Java中多线程原理详解

    Java是少数的集中支持多线程的语言之一,大多数的语言智能运行单独的一个程序块,无法同时运行不同的多个程序块,Java的多线程机制弥补了这个缺憾,它可以让不同的程序块一起运行,这样可以让程序运行更加顺 ...

随机推荐

  1. 如何计算 App 的启动时间

    应用启动场景 事实上 Android 中一个 App 的启动时间可以准确计算的.但是要分场景.也就是说要分开游戏和应用. 大家都知道,在Android中,游戏开发和应用开发是两码事.所以我们需要分开来 ...

  2. python 搭建http服务器和ftp服务器

    默认安装版本为pytho2.7 http服务器搭建: 进入要开放访问的目录下,执行命令:python -m SimpleHTTPServer 9000 显示上述表示安装成功,且http服务的端口为:9 ...

  3. 三、vue脚手架工具vue-cli的使用

    1.vue-cli构建 vue-cli工具构建:https://blog.csdn.net/u013182762/article/details/53021374 npm的镜像替换成淘宝 2.项目运行 ...

  4. Python_oldboy_自动化运维之路_线程,进程,协程(十一)

    本节内容: 线程 进程 协程 IO多路复用 自定义异步非阻塞的框架 线程和进程的介绍: 举个例子,拿甄嬛传举列线程和进程的关系: 总结:1.工作最小单元是线程,进程说白了就是提供资源的 2.一个应用程 ...

  5. windows下安装apache zookeeper

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  6. 使用VSCode创建.NET Core 项目,添加类库间引用

    注:网络上搜索到的关于VsCode创建调试.Net Core 项目的文章都比较老旧,不能完全参考使用,根据网络文章.微软官方文档的指导下,学习并整理此文档,但也大体和文档学习路线相似,主要为记录学习过 ...

  7. Sublime Text 中open in browser /view in browser 无反应

    问题 早上用Sublime Text写html的时候,发现右键的open in browser或view in browser命令都突然无法使用了,无法像以前一样在浏览器打开编写的页面了. 开始以为是 ...

  8. 【LOJ】#2230. 「BJOI2014」大融合

    题解 我现在真是太特么老年了 一写数据结构就颓废,难受 这题就是用lct维护子树 ???lct怎么维护子树 这样想,我们给每个点记录虚边所在的子树大小,只发生在Access和link的时候 这样的话我 ...

  9. 【LOJ】#2549. 「JSOI2018」战争

    题解 仔细分析了一下,如果写个凸包+每次暴力半平面交可以得到70分,正解有点懵啊 然后用到了一个非常结论,但是大概出题人觉得江苏神仙一个个都可以手证的结论吧.. Minkowski sum 两个凸包分 ...

  10. 【GOF23设计模式】--工厂模式

    工厂模式: 实现了创建者调用者的分离 详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 面向对象设计的基本原则: OCP(开闭原则,Open-Closed Principle):一个软件的实体应当 ...