首页 > 编程语言 >Java SE入门及基础(61)& 死锁 & 死锁发生条件

Java SE入门及基础(61)& 死锁 & 死锁发生条件

时间:2024-07-02 18:59:06浏览次数:19  
标签:Java Thread Object 61 死锁 线程 o2 o1

目录

死锁

1. 死锁的概念

2. 死锁发生条件

互斥条件

不可剥夺条件

请求与保持条件

循环等待

3. 案例分析

示例

分析


死锁

1. 死锁的概念

        Deadlock describes a situation where two or more threads are blocked forever, waiting for each other         死锁描述了一种情况,其中两个或多个线程永远被阻塞,互相等待

2. 死锁发生条件

互斥条件
        线程要求对所分配的资源进行排他性控制,即在一段时间内某资源仅为一个线程所占有。此时若有其他线程请求该资源,则请求线程只能等待。
不可剥夺条件
        线程所获得的资源在未使用完毕之前,不能被其他线程强行夺走,即只能由获得该资源的线程自己来释放(只能是主动释放)。
请求与保持条件
        线程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他线程占有,此时请求线程被阻塞,但对自己已获得的资源保持不放。
循环等待
        存在一种线程资源的循环等待链,链中每一个线程已获得的资源同时被链中下一个线程所请求。

3. 案例分析

示例
public class DeadLockTest {
    public static void main(String[] args) {
        Object o1 = new Object();
        Object o2 = new Object();
        DeadLockTask task1 = new DeadLockTask(o1, o2, 0);
        DeadLockTask task2 = new DeadLockTask(o1, o2, 1);
        Thread t1 = new Thread(task1);
        Thread t2 = new Thread(task2);
        t1.start();
        t2.start();
    }
    static class DeadLockTask implements Runnable{
        private Object o1, o2;
        private int flag; //锁使用的条件
        public DeadLockTask(Object o1, Object o2, int flag) {
            this.o1 = o1;
            this.o2 = o2;
            this.flag = flag;
        }
        @Override
        public void run() {
            String name = Thread.currentThread().getName();
            if(flag == 0){
                synchronized (o1){
                    System.out.println(name + "锁定对象o1");
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (o2){
                        System.out.println(name + "锁定对象o2");
                    }
                }
            } else {
                synchronized (o2){
                    System.out.println(name + "锁定对象o2");
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (o1){
                        System.out.println(name + "锁定对象o1");
                    }
                }
            }
        }
    }
}
分析
        线程t1 开始执行,首先会将持有对象 o1 的锁,然后开始睡眠 0.5 秒,此时,线程 t2 开始执行,首先会持 有对象o2 的锁,然后开始睡眠 0.5 秒。         线程t1 睡眠结束,尝试获得对象 o2 的锁,此时发现对象 o2 已经被其他线程 t2 锁住,此时 t1 被阻塞在外,等待对象o2 上的锁释放。         线程t2 睡眠结束,尝试获得对象 o1 的锁,此时发现对象 o1 已经被其他线程 t1 锁住,此时 t2 被阻塞在外,等待对象o1 上的锁释放。

标签:Java,Thread,Object,61,死锁,线程,o2,o1
From: https://blog.csdn.net/m0_63181360/article/details/140134006

相关文章

  • No native JavaCPP library in memory. (Has Loader.load() been called?)
    Exceptioninthread"main"java.lang.RuntimeException:NonativeJavaCPPlibraryinmemory.(HasLoader.load()beencalled?) atorg.bytedeco.javacpp.BytePointer.<init>(BytePointer.java:103) atorg.bytedeco.javacv.Frame.<init>(Frame......
  • 【Java面试场景题】如何设计一个敏感词过滤系统?
    一、问题解析下图是一个完整的文本审核流程,包括名单匹配、敏感词匹配、AI机器审核、人工审核四个环节。待审核文本需要顺次通过名单匹配、敏感词匹配、AI机器审核三个流程,若结果为嫌疑则需要人工审核,否则将直接给出确定的结果。敏感词匹配功能可以迅速地匹配文本中的敏感词汇......
  • Java_多线程:实现多线程
    Java中实现多线程的常用方式:继承Thread类实现Runnable接口实现Callable接口(JDK>=1.5)线程池方式创建实现Runnable接口与Callable接口的区别实现Runnable接口和Callable接口的方式基本相同,不过Callable接口里定义的方法返回值,可以声明抛出异常。Runnable和Callable与......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript运动网站(田径)
    HTML+CSS+JS【运动网站】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript购物商城(Oppo)
    HTML+CSS+JS【购物商城】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • java多线程-锁的介绍
    多线程中常用锁一、锁的概念二、锁的类型2.1互斥锁(也称排它锁)2.1.1Synchronized和Lock2.1.2ReentrantLock(可重入锁)2.1.3公平锁2.1.4非公平锁2.1.5中断锁2.2共享锁2.3读写锁三、悲观锁和乐观锁3.1悲观锁3.2乐观锁3.3CAS算法四、锁竞争一、锁的概念在多......
  • (Java)知其然且知其所以然系列4
    写在开头本系列内容主要涵盖我在深入学习Java过程中对一些知识点的深入理解和巩固。如果内容表达不准确或存在谬误,欢迎在评论区或私信中进行补充或指正~目录Java接口、内部类、包        接口可以继承吗?        接口继承要重写父接口的方法吗?     ......
  • 书城在线系统:基于Java和SSM框架的高效信息管理平台
    开头语:你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。开发语言:Java数据库:MySQL技术:SSM框架(Spring,SpringMVC,Mybatis)工具:MyEclipse,Tomcat,MySQL系统展示首页管理员功能模块用户功能模块前台首页功能模块摘要雅博书城在线系统,一......
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-1-环境准备与搭建
    1.简介Python+Playwright系列的文章还没有结束,就有好的小伙伴或者童鞋们私信公众号留言,问宏哥什么时候出Java语言的Playwright的自动化测试文章。本来想趁热打铁将Python+Playwright完结后,就开始Java语言的Playwright的自动化测试文章,但是好多人私信留言,索性就两个系列的文章......
  • Java实现登录验证 -- JWT令牌实现
    目录1.实现登录验证的引出原因2.JWT令牌2.1使用JWT令牌时2.2令牌的组成三.JWT令牌(token)生成和校验3.1引入JWT令牌的依赖3.2使用Jar包中提供的API来实现JWT令牌的生成和校验3.3使用JWT令牌验证登录1.实现登录验证的引出传统思路下:登录页面把用户名和密码交......