java面试强基(23)

news2024/11/28 2:41:19

 

 

什么是线程死锁?如何避免死锁? 

​ 线程死锁描述的是这样一种情况:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

上面的例子符合产生死锁的四个必要条件:

  1. 互斥条件:该资源任意一个时刻只由一个线程占用。
  2. 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。
  3. 不剥夺条件:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。
  4. 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。

如何预防死锁? 

破坏死锁的产生的必要条件即可:

  1. 破坏请求与保持条件 :一次性申请所有的资源。
  2. 破坏不剥夺条件 :占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
  3. 破坏循环等待条件 :靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。

如何避免死锁?

避免死锁就是在资源分配时,借助于算法(比如银行家算法)对资源分配进行计算评估,使其进入安全状态。

在开发过程中:

  1. 要注意加锁顺序,保证每个线程按同样的顺序进⾏加锁

  2. 要注意加锁时限,可以针对所设置⼀个超时时间

  3. 要注意死锁检查,这是⼀种预防机制,确保在第⼀时间发现死锁并进⾏解决

说说 sleep() 方法和 wait() 方法区别和共同点? 

  • 两者最主要的区别在于:**sleep() 方法没有释放锁,而 wait() 方法释放了锁** 。
  • 两者都可以暂停线程的执行。
  • wait() 通常被用于线程间交互/通信,sleep() 通常被用于暂停执行。
  • wait() 方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的 notify() 或者 notifyAll() 方法。sleep() 方法执行完成后,线程会自动苏醒。或者可以使用 wait(long timeout) 超时后线程会自动苏醒。
public class MyYieldStudy {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        System.out.println(end-start + "毫秒过去了");
    }
}
class ThreadA extends Thread{
    public ThreadA(String name) {
        super(name);
    }
    public void run() {     
        System.out.println(Thread.currentThread().getName() + " run ");
        // 死循环,不断运行。
        while(true){;}  //  这个线程与主线程无关,无 synchronized 
    }
}
public class WaitTimeoutTest {
    public static void main(String[] args) {
        ThreadA t1 = new ThreadA("t1");
        synchronized(t1) {
            try {
                // 启动“线程t1”
                System.out.println(Thread.currentThread().getName() + " start t1");
                t1.start();
                // 主线程等待t1通过notify()唤醒 或 notifyAll()唤醒,或超过3000ms延时;然后才被唤醒。
                System.out.println(Thread.currentThread().getName() + " call wait ");
                t1.wait(3000);
                System.out.println(Thread.currentThread().getName() + " continue");
                t1.stop();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提高短视频的收藏下载和转发率的方法,我们可以不做但不能不会

想要提高收藏和下载,那就要提高你内容的价值感和获得感。 我们要清晰的知道收获感不等同于真正的收获。那我们的做法就是给出冗余的有用,给出熟悉的陌生,给出精准的表达。那这是提高收藏转发的方法。 我们看到好看的视频,想分享视…

Hack the box -- Responder靶机

这个靶机记录一下。。感觉会用到。 任务1 当使用IP地址访问web服务时,我们被重定向到的域是什么? 这里我们访问一下ip,然后重定向了 FLAG:unika.htb 任务2 服务器上使用哪种脚本语言生成网页? 这里因为重定向域的问题,我们是访问不了的会报…

408 | 【2022年】计算机统考真题 自用回顾知识点整理

一、数据结构 T1:时间复杂度 ——直接求程序执行的次数 T5:哈夫曼树(最优二叉树)与哈夫曼编码 定义 结点带权路径长度:从根到任一节点的路径长度(经过的边数)与该结点权值的乘积树的带权路径长度WPL:所有叶节点的带权路径长度之和 哈夫曼树:WPL最小的二叉树哈夫曼树的…

PHPMailer发送邮件(PHP发送电子邮件)

很多网站注册时都会要求输入电子邮箱,其应用场景是比较广的,例如注册账号接收验证码、注册成功通知、登录通知、找回密码验证通知等。本文将介绍如何使用PHP实现发送邮件。 开源项目PHPMailer 使用了开源项目PHPMailer,本文使用163邮箱作为…

挑战一天速通python基础语法

挑战一天速通python基础语法 文章目录挑战一天速通python基础语法0. 防止某人健忘1. 一些小点2. 输入输出2.1 输出2.2 输入3. 一些基础语法3.1 条件语句3.2 循环语句3.3 空语句4. 函数5. 列表和元组5.1 列表5.2 元组6. 字典7. 文件操作再有一个月参加一个NTU的线上科研项目。。…

MicroPython-On-ESP8266——8x8LED点阵模块(5)自制贪吃蛇游戏

MicroPython-On-ESP8266——8x8LED点阵模块(5)自制贪吃蛇游戏 1. 背景知识 连续折腾了一段时间的8x8点阵屏模块,从基本原理到驱动它显示滚动图案效果,常用的功能都使用到了。系列如下: MicroPython-On-ESP8266——8…

文件下载漏洞详解

今天继续给大家介绍渗透测试相关知识,本文主要内容是文件下载漏洞详解。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未授权设备…

速锐得视角—数字化能源新时代的影响挑战趋势

数字化正在改善能源系统的安全性、生产力、普及率和可持续性,但是同时数字化也引发了新的安全和隐私风险,此外,市场、企业和工作岗位也受数字化的影响,改变工种结构,在数字化新时代来临前,正在发生一些细微…

计算机毕业设计java+springboot+vue学生宿舍管理系统

项目介绍 通篇文章的撰写基础是实际的应用需要,然后在架构系统之前全面复习大学所修习的相关知识以及网络提供的技术应用教程,以学生宿舍管理系统的实际应用需要出发,架构系统来改善现学生宿舍管理系统及出入登记平台工作流程繁琐等问题。不仅如此以操作者的角度来说,该系统的…

数字IC验证快速入门,你想知道的干货都在这里

网上有很多人咨询关于数字IC验证的行情,下面大多数回答都说薪资高、机会多、发展好。 确实,一款芯片从立项到流片生产需要经过层层自测和验证,否则芯片注定是失败。可以说,IC验证是IC设计的关键所在。 验证的重要性 这些年来&a…

020 | 我国河长制运行中的公众协同参与机制研究 | 大学生创新训练项目申请书 | 极致技术工厂

研究目的营造全社会共同关心和保护河湖的良好氛围、拓宽公众参与渠道 公众参与河湖保护具有自身优势。公众是河湖保护的坚实力量,探求河长制中的公众参与机制,营造全社会关心保护环境的良好社会氛围是改善流域生态环境的根本举措。协同治理的发展以社会壮…

为什么要学习rust

一、rust的实现、优点 实现:明确/(零成本)抽象/赋能优点:兼具高性能/安全性/表达力 明确:rust不像其他的语言,这些编程语言为了照顾初学者,它会把很多基本概念隐藏在基本语法之后,它…

数图互通高校房产管理——公积金补贴管理

数图互通房产管理系统在这方面做得比较全面; 1、公积金管理 1.1 公积金开户申请、审核 新进入学校的职工、博士后(含特别研究助理)公积金开户申请老师登录平台进行公积金开户申请,申请页面先选择人员类型“在职、项目、博士后、特别研究助理”,由房产…

Oracle视图、索引与存储过程

目录 一、视图 二、索引 三、存储函数 (一)存储函数的语法结构 (二)案例 1.输入ID,返回NAME 2.传入数字,能够被2整除就是偶数,不能被2整除的就是奇数 3.对两个数字求和,对和判断奇偶数 4.判断SCOTT用户下,工资…

m基于鱼群优化算法的的三维场景下人员疏散系统matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 人工鱼群优化算法,模仿鱼群的行为特点而设计的一种寻优策略。人工鱼群算法(Artificial Fish Swarm Algorithm,AFSA)是Li Xiao-lei在2002年提出的(Yazdani, Toosi, & M…

全网惟一面向软件测试人员的Python基础教程-在Python中怎么干倒字符串?

全网惟一面向软件测试人员的Python基础教程 起点:《python软件测试实战宝典》介绍 第一章 为什么软件测试人员要学习Python 第二章 学Python之前要搞懂的道理 第三章 你知道Python代码是怎样运行的吗? 第四章 Python数据类型中有那些故事呢?…

邂逅Vue3和Vue3开发体验

文章目录01-邂逅Vue3和Vue3开发体验Vue3带来的变化如何使用Vue方式一&#xff1a;CDN引入方式二——下载和引入计数器案例原生实现Vue实现MVVMtemplate写法一写法二datamethod其他属性01-邂逅Vue3和Vue3开发体验 Vue3带来的变化 如何使用Vue 方式一&#xff1a;CDN引入 <d…

Hadoop 综合实训(编写ing)

文章目录一&#xff0c;显示文件内容&#xff08;一&#xff09;启动hadoop服务&#xff08;二&#xff09;创建并上传本地文件&#xff08;1&#xff09;创建students.txt文件&#xff08;2&#xff09;上传文件到HDFS&#xff08;三&#xff09;创建Maven项目&#xff1a;Dis…

windows11执行python没有任何反应或拉起应用商店的解决办法

1 是什么&#xff08;现象&#xff09; 高高兴兴的用上新电脑&#xff0c;系统Windows11&#xff0c;结果发现用power shell执行python姿势不对。 python bioParser.py 点击Enter&#xff0c;结果秒结束&#xff01;而我的python脚本明明有很多打印&#xff01; 如果只执行py…

服务机器人“大战”进入下半场,竞争焦点变了

对于机器人企业而言&#xff0c;“卖出去”是商业本质。 如何“卖出去”&#xff0c;往往是企业之间的竞争焦点&#xff0c;它也许是技术&#xff0c;也许是营销&#xff0c;但随着服务机器人大战进入下半场&#xff0c;服务机器人的竞争焦点正在发生根本上的改变。 竞争焦点…