2024年150道高频Java面试题(二十七)

53. 什么是 Java 中的死锁?如何避免?

Java中的死锁是指两个或两个以上的线程因为竞争资源而造成的一种僵持状态,每个线程都在等待其他线程释放锁,但是这些锁又被其他线程持有,导致没有任何线程能继续执行下去,形成一种循环等待的局面。

死锁通常发生在以下四个条件同时满足时:

  1. 互斥条件:资源不能被多个线程共同使用,只能由一个线程独占。
  2. 占有且等待条件:线程至少持有一个资源,并且正在等待获取额外的资源,而该资源又被其他线程持有。
  3. 非抢占条件:线程持有的资源在未使用完毕前不能被其他线程强行抢占。
  4. 循环等待条件:存在一个线程与资源之间的循环等待链,每个线程都在等待下一个线程所持有的资源。

避免死锁的策略包括:

  1. 破坏死锁的四个必要条件之一:
    • 互斥条件无法破坏,因为它是资源使用的必要条件。
    • 通过一次性请求所有需要的资源来破坏占有且等待条件。
    • 允许线程剥夺已占有的资源,破坏非抢占条件。
    • 通过资源的有序分配来破坏循环等待条件,比如对所有资源进行编号,线程按编号顺序请求资源。
  2. 避免策略:
    • 设计合理的资源申请顺序,保证所有线程按照相同的顺序请求资源。
    • 减少资源的占有时间,尽快释放不再需要的资源。
    • 使用锁排序,确保所有线程都按照固定的全局顺序获取锁。
  3. 检测与恢复:
    • 通过资源分配图或者银行家算法来检测死锁,一旦检测到死锁,采取措施解除。
    • 通过线程回滚或者资源抢占来回滚到没有死锁的状态。
  4. 避免长时间锁:
    • 使用尝试获取锁的机制,如 tryLock() 方法,如果不能立即获取锁,则放弃。
    • 对锁进行超时处理,超时后自动放弃锁,减少资源占用时间。

以下是一个简单的死锁示例:

public class DeadlockDemo {public static void main(String[] args) {final Object resource1 = "Resource1";final Object resource2 = "Resource2";Thread t1 = new Thread(() -> {synchronized (resource1) {System.out.println("Thread 1: Locked resource 1");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}synchronized (resource2) {System.out.println("Thread 1: Locked resource 2");}}});Thread t2 = new Thread(() -> {synchronized (resource2) {System.out.println("Thread 2: Locked resource 2");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}synchronized (resource1) {System.out.println("Thread 2: Locked resource 1");}}});t1.start();t2.start();}
}

在上面的代码中,如果两个线程同时执行,并且分别获得了不同的锁,然后试图获取对方持有的锁,就可能导致死锁的发生。通过上述避免策略,我们可以重新设计代码,以避免这种潜在的问题。

54. synchronized 和 volatile 关键字有何区别?

synchronizedvolatile是Java中的两个关键字,它们被用于控制多线程访问共享资源时的同步问题。

  1. 作用域不同
    • synchronized可以修饰方法或代码块,它可以保证在同一时刻只有一个线程可以执行某个方法或代码块。
    • volatile只能用来修饰变量,确保对变量的读写操作对所有线程立即可见。
  2. 内存语义
    • 使用synchronized时,当线程进入同步代码块或方法,它会清空工作内存中的共享变量值,从主内存中重新读取。当线程退出同步代码块或方法时,它会将工作内存中的共享变量的最新值刷新回主内存。
    • volatile变量则是直接从主内存读取,对它的写操作也会直接写入主内存,保证了新值对其他线程的可见性。
  3. 操作粒度
    • synchronized的操作粒度比较粗,它锁定的是整个方法或代码块,在锁定期间其他线程无法访问同步资源。
    • volatile的操作粒度比较细,仅保证对单个变量的读写操作的可见性和有序性。
  4. 锁的影响
    • synchronized可以给方法或代码块加锁,导致线程在执行时会阻塞,等待锁的释放。
    • volatile不会造成线程的阻塞。
  5. 有序性
    • synchronized保证了操作的有序性,即进入同步代码块或方法的操作将在退出同步代码块或方法之前全部执行完毕。
    • volatile通过禁止指令重排优化,也保证了操作的有序性。

以下是一个使用synchronizedvolatile的示例:

public class Counter {// 使用volatile修饰共享变量private volatile int count = 0;// 使用synchronized修饰方法public synchronized void increment() {count++; // 这里隐式地使用了count变量}public int getCount() {return count; // 这里读取volatile变量}
}

在这个示例中,increment方法使用了synchronized,确保了在执行count++操作时,其他线程不能同时访问该方法。而变量count被声明为volatile,保证了count值的变化对其他线程是可见的。

总结来说,synchronized用于控制多线程访问资源的同步,关注的是操作的原子性和线程的互斥;而volatile关注的是变量访问的可见性和有序性,但不保证复合操作的原子性。
领【150 道精选 Java 高频面试题】请go公众号:码路向前 。

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

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

相关文章

中国电子学会(CEIT)2022年03月真题C语言软件编程等级考试四级(含详细解析答案)

中国电子学会(CEIT)考评中心历届真题(含解析答案) C语言软件编程等级考试四级 2022年03月 编程题四道 总分:100分一、拦截导弹(25分) 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度…

npm: .npmrc pnpm

pnpm i 安装依赖时&#xff0c;pnpm 的镜像源优先级遵循以下顺序&#xff1a; 命令行参数&#xff1a;可以通过在 pnpm i 命令中使用 --registry 的方式指定镜像源&#xff0c;此时会优先使用命令行参数指定的镜像源。 pnpm i --registry< registry-url >.npmrc 配置&…

谈谈我的软考高级考证之路(系统架构设计师篇)

系统架构设计师备考资料请移步 2023年软考高级系统架构设计师视频教程&#xff0c;推荐下载&#xff01;获取。 备考总体策略 • 总体策略&#xff1a;刷视频记笔记刷真题 • 备考时间&#xff1a;建议报完名之后&#xff0c;开始备考&#xff0c;大致2-3个月&#xff08;基础…

【Java多线程】案例(4):定时器

目录 一、定时器是什么? 二、Java标准库中的定时器 三、自己实现定时器 四、标准库中更推荐使用的定时器 一、定时器是什么? 定时器是一种用于在指定时间间隔或特定时间点执行特定任务的工具或设备。在计算机科学中&#xff0c;定时器通常是软件或硬件组件&#xff0c;用…

智过网:注册安全工程师注册有效期与周期解析

在职业领域&#xff0c;各种专业资格认证不仅是对从业者专业能力的认可&#xff0c;也是保障行业安全、规范发展的重要手段。其中&#xff0c;注册安全工程师证书在安全生产领域具有举足轻重的地位。那么&#xff0c;注册安全工程师的注册有效期是多久呢&#xff1f;又是几年一…

Elasticsearch下载安装 以及Reindex(数据迁移)

部署Elasticsearch集群 这里介绍使用的是Elasticsearch 7.6.1的版本&#xff0c;配置两台服务器&#xff0c;一台部署主节点&#xff0c;一台部署两个从节点。 下载地址&#xff1a;https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.16.2-linux-x86_64…

backTrack Mock

1.简而言之&#xff0c;一个集合里求组合就要用startIndex。 2.startIndex本身保证了组合的不同&#xff0c;需要求不同组合就要用startIndex&#xff1b;但从 i 开始还是从 i 1 开始决定了组合元素能不能重复选。&#xff08;39&#xff09; 3.组内既不能重复选&#xff0c…

【Java探索之旅】方法重载 递归

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、方法重载1.1 为什么要有方法重载1.2 方法重载的概念与使用1.3 方法签名 二、递归2…

小程序面试题之性能优化提高11道

1.如何实现上拉加载分页列表的性能优化 我们的功能里面有个滚动到底部加载的功能&#xff0c;优化前我们的做法是这样的&#xff1a; 大部分人面对长列表滚动的时候&#xff0c;一开始的处理方式都是这样的&#xff0c;如果数据不多&#xff0c;只有几页可能不会太暴露问题&…

在QT里使用SQLite数据库

什么是SQLite数据库&#xff1f;SQLite是一种轻量级的数据库管理系统&#xff0c;它不需要一个独立的服务器进程&#xff0c;可以被集成到应用程序中。SQLite是开源的&#xff0c;支持跨平台操作&#xff0c;并且使用非常广泛。在QT里如何使用SQLite数据库呢&#xff1f;废话不…

软考高级架构师:随机函数模型

一、AI 讲解 随机函数模型是理解各种随机过程和算法的一个重要概念&#xff0c;在软件工程、算法设计以及系统分析中有着广泛的应用。简而言之&#xff0c;随机函数模型是一种用于描述具有随机性的系统或过程的数学模型&#xff0c;它能够帮助我们预测和分析在不确定性下的系统…

吴恩达2022机器学习专项课程(一) 5.5 特征缩放1 5.6 特征缩放2

问题预览/关键词 什么是特征缩放&#xff1f;作用是什么&#xff1f;特征尺度和参数w权重的关系是&#xff1f;算法为什么要调节w权重&#xff1f;不进行特征缩放对梯度下降的影响&#xff1f;有特征缩放对梯度下降的影响&#xff1f;实现特征缩放的三种方法是&#xff1f;如何…

JetBrains IntelliJ IDEA 2024.1 发布 - 领先的 Java 和 Kotlin IDE

JetBrains IntelliJ IDEA 2024.1 发布 - 领先的 Java 和 Kotlin IDE 请访问原文链接&#xff1a;JetBrains IntelliJ IDEA 2024.1 (macOS, Linux, Windows) - 领先的 Java 和 Kotlin IDE&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;s…

sqlmap一些常用命令

仅供交流学习使用&#xff0c;请勿用于非法用途 1&#xff09;检测url存在漏洞情况&#xff1a;python sqlmap.py -u "http://192.168.88.128/sqli-labs-master/Less-1/?id1" 2&#xff09;获取所有数据库名称&#xff1a;python sqlmap.py -u "http://192.168…

达梦数据库导入导出工具dmfldr

达梦数据库导入导出工具dmfldr 基础信息 OS版本&#xff1a; Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a; DM Database Server 64 V8 DB Version: 0x7000c 03134284132-20240115-215128-200811 dmfldr工具介绍 dmfldr&#xff08;DM Fast Loade…

大厂Java笔试题之统计兔子出生问题

题目&#xff1a;有一种兔子&#xff0c;从出生后第3个月起每个月都生一只兔子&#xff0c;小兔子长到第三个月后每个月又生一只兔子。 例子&#xff1a;假设一只兔子第3个月出生&#xff0c;那么它第5个月开始会每个月生一只兔子。 一月的时候有一只兔子&#xff0c;假如兔子…

ip addr和ifconfig区别

ip addr和ifconfig都是用于配置和管理网络接口的工具 1. ifconfig ifconfig是较旧的网络配置工具&#xff0c;属于net-tools套件的一部分。 该命令主要用于配置、显示和控制网络接口的参数&#xff0c;如IP地址、子网掩码、广播地址等。 ifconfig命令的功能相对有限&#xff…

设计模式之责任链讲解

责任链模式适用于需要将请求和处理解耦的场景&#xff0c;同时又需要动态地组织处理逻辑的场景。 通过使用责任链模式&#xff0c;可以实现请求的动态处理、灵活的扩展和简化的代码编写&#xff0c;提高系统的可维护性和可扩展性。 一、责任链入门 以下这是GPT生成的责任链代…

(三)PostgreSQL的pg_ctl命令

PostgreSQL的pg_ctl命令 pg_ctl 是 PostgreSQL 用于控制数据库服务器进程的命令行工具。它提供了启动、停止、重启数据库服务器以及管理其运行状态的手段。pg_ctl 命令尤其适用于从命令行或脚本中管理 PostgreSQL 服务&#xff0c;而不是通过操作系统的服务控制管理器。 基础…

css 太极图案例带来的收获

基础知识 渐变&#xff1a;gradient 在两个或者多个颜色之间显示平稳过度。由浏览器生成。 线性渐变&#xff1a;line-gradient(过渡方向&#xff0c;初始颜色&#xff0c;结束颜色)。注意过渡方向默认从上到下。 1、支持多颜色渐变&#xff0c;多个值&#xff0c;就是从多个…