首页 > 其他分享 >浅谈死锁

浅谈死锁

时间:2023-08-14 20:01:13浏览次数:67  
标签:count 浅谈 blocker2 死锁 blocker1 线程 new

1.死锁是如何产生

 多个线程同时被阻塞

它们其中的一个或者多个等待某个资源的释放

而由于线程全部阻塞,资源的释放无限期的延迟

因此程序不可能终止

2.死锁的三个典型情况

2.1 一个线程一把锁,可重入锁没事,不可重入锁死锁

2.2 两个线程两把锁,即使是可重入锁,也会出现死锁

public class ThreadDemo {
    static class Add{
        public int count;
        public void add(int count) {
            count++;
        }
    }

    public static void main(String[] args) {
        Object blocker1 = new Object();
        Object blocker2 = new Object();
        Add a= new Add();
       // blocker2 释放后 blocker1 才解锁
        Thread t1 = new Thread(() -> {
            synchronized (blocker1) {
                synchronized (blocker2) {
                    for (int i = 0; i < 5000; i++) {
                        a.add(a.count);
                    }
                    System.out.println(a.count);
                }
            }
        });
         // blocker1 释放后 blocker2 才解锁 
        Thread t2 = new Thread(() -> {
            synchronized(blocker2) {
                synchronized (blocker1) {
                    for (int i = 0; i < 5000; i++) {
                        a.add(a.count);
                    }
                    System.out.println(a.count);
                }
            }
        });
    }
}

循环等待

浅谈死锁_i++

2.3 n 个线程, m 把锁(哲学家就餐问题)

每个哲学家两两之间放着一根筷子

浅谈死锁_重入锁_02

每个哲学家有么思考人生,要么拿起两根筷子吃面(先拿左再拿右)

浅谈死锁_重入锁_03

浅谈死锁_i++_04

假如哲学家同时拿起左手边筷子,如果再拿起右手边就会发现筷子都被占用了

哲学家互不相让就会出现死锁

3.死锁的四个必要条件

3.1 互斥使用

当资源被一个线程使用时,另外的线程不能使用

3.2 不可抢占

一个线程拿到锁只能自己主动释放锁,其他的线程不可强行占有

3.3 请求和保持

当资源请求者保持对原有的资源占用,同时在请求其他的资源(吃着着碗里的,看着锅里的)

3.4 循环等待

存在一个等待队列, q1占用q2, q2占用q1(家里钥匙落车里,车钥匙落家里)

4.如何打破死锁

任意打破死锁的四个必要条件之一

而循环等待是最容易打破的,我们可以把每个锁进行排序

锁排序

n个线程m个锁,针对m个锁从小到大进行锁排序

n个线程获取锁的时候,按照编号从小到大进行获取锁

这样就可以避免循环等待

浅谈死锁_重入锁_05

这样哲学家5,想要4号筷子就得先释放5号筷子(锁) 避免死锁

标签:count,浅谈,blocker2,死锁,blocker1,线程,new
From: https://blog.51cto.com/u_16166203/7080799

相关文章

  • 浅谈人工智能技术与物联网结合带来的好处
    物联网是指通过互联网和各种技术将设备进行连接,实时采集数据、交互信息的网络,对设备实现智能化自动化感知、识别和控制,给人们带来便利。人工智能是计算机科学的一个分支,旨在研究和开发能够模拟人类智能的技术和方法。人工智能通过模仿、延伸和扩展人类的自然智能,使计算机能够具备......
  • 浅谈关于电气线路短路引起的电气火灾的原因
    未晓妃安科瑞电气股份有限公司上海嘉定201801摘要:我国人口众多,同时对用电需求也非常多。我们日常生活需要电力来照亮我们的家园并为工业供电。它可以是建设性的,也可以是破坏性的,这取决于处理它的谨慎程度。稍有不慎,就会引发火灾,造成经济损失和惨痛的伤害。电气火灾中*危险的故障......
  • 浅谈什么是 Spring Cloud
    SpringCloud是一个用于构建分布式系统的开发工具包,它基于SpringFramework提供了一系列的解决方案和工具,用于帮助开发者快速构建和部署云原生应用。SpringCloud主要关注的是分布式系统中常见的配置管理、服务注册与发现、熔断器、负载均衡、路由、微服务追踪等问题,提供了一套......
  • 浅谈卡特兰数
    定义先给一个通项公式\(Cat(n)=\frac{C_{2n}^{n}}{n+1}\)。卡特兰数是一个比较通用的模型,有很多的问题都与其有关,其中比较经典的是括号序列计数和二叉树计数。经典的问题一些描述括号序列计数给定\(n\),求有多少个合法的长度为\(2n\)的括号序列。二叉树计数给定\(n\),......
  • 浅谈背包
    引入背包问题,是大多数oier在学习动态规划(下文用dp代替)的过程中,最先接触到的问题。它看似简单,有蕴含着无穷的变化。本文便对作者接触过的背包问题做一个总结。背包问题,一般情况下指:你有\(n\)个物品和一个容量为\(m\)的背包,每个物品有重量\(w\)和价值\(v\),各个物品间可......
  • java多线程:死锁
    一、死锁的定义   多线程以及多进程改善了系统资源的利用率并提高了系统的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。   所谓死锁是指两个或两个以上的线程在......
  • 隐私计算之浅谈联邦学习
    本文分享自天翼云开发者社区《隐私计算之浅谈联邦学习》 作者:l****n一、背景“数据孤岛”简单的讲,各组织都持有各自的数据,这些数据之间互有关系但又独立存储于各组织。出于安全性、合规性等方面考虑,各组织只能查询、使用己方数据,无法交换其它组织的数据。在联邦学习出现前,针对......
  • 浅谈根号分治
    浅谈根号分治一、问题引入  给定一个长度为\(n\)的序列,进行\(m\)次询问。每次询问给出两个数字\(x,y\)。对于每次询问,输出所有下标模除\(x\)等于\(y\)的元素的总和。  对于这个问题,我们发现他要维护的是一段离散的元素的和,而我们平时学的数据结构,如线段树等都只能维护一段......
  • 浅谈弧光保护在中低压开关柜中的应用
    未晓妃安科瑞电气股份有限公司上海嘉定201801摘要:近年来,中低压开关柜的使用越来越普遍。在此过程中,确保开关柜平稳运行至关重要。并在此基础上,阐述了由此产生的弧光和电弧事故的危险性,引入弧光保护及母线保护的特点必要性分析,阐述了弧光保护系统的原理和结构。工程实例证明,弧光保......
  • CGAL入门——浅谈CGAL
    CGAL官网https://doc.cgal.org/latest/Manual/index.html最近在学习CGAL,发现CGAL中文资料太少了,官网示例代码也很少注释,还加入了很多自定义的很少见过的名词,易读性略差,学习起来有点难度赶紧记录一下学习过程,怕以后忘了 1.简介CGAL(ComputationalGeometryAlgorithmsLibrar......