整理好了!2024年最常见 20 道并发编程面试题(十)

上一篇地址:整理好了!2024年最常见 20 道并发编程面试题(九)-CSDN博客

十九、什么是synchronized关键字以及它如何工作?

synchronized关键字在Java中是一个非常重要的同步机制,用于控制对共享资源的并发访问,以确保线程安全。以下是synchronized关键字的详细解释和工作原理:

基本概念

synchronized关键字可以用于方法或代码块上,以实现以下功能:

  • 确保一次只有一个线程可以执行某个方法或代码块。
  • 确保线程在执行过程中对共享资源的访问是互斥的。

工作原理

  1. 锁的概念synchronized关键字背后的核心是锁的概念。当一个线程访问一个对象的synchronized方法或代码块时,它会首先尝试获取该对象的锁。如果锁已经被其他线程持有,当前线程将被阻塞,直到锁被释放。

  2. 锁的获取:如果一个对象没有被锁定,那么访问该对象的synchronized方法或代码块的线程将获得锁,并继续执行。如果对象已经被锁定,其他线程将等待直到锁被释放。

  3. 锁的释放:当线程执行完synchronized方法或代码块后,它会自动释放锁,允许其他线程获取该锁。

  4. 锁的范围

    • 对于同步方法,锁是当前实例对象(如果方法是非静态的)或类对象(如果方法是静态的)。
    • 对于同步代码块,锁是指定的对象,即synchronized(this)synchronized(someObject)中的thissomeObject
  5. 重入性synchronized关键字支持重入性,即同一个线程可以多次获取同一个对象的锁,而不会阻塞。

使用场景

  • 共享资源访问:当多个线程需要访问同一个资源,并且该资源不是线程安全的,synchronized可以用来确保一次只有一个线程可以访问该资源。
  • 实现线程安全synchronized可以用来保证方法或代码块的线程安全性,防止数据竞争和不一致的问题。

性能考虑

  • 使用synchronized可能会引入性能开销,因为线程需要等待锁的释放。在高并发场景下,这可能导致性能瓶颈。
  • 为了减少性能影响,可以使用其他并发工具,如java.util.concurrent包中的锁(如ReentrantLock)。

死锁问题

  • 不当使用synchronized可能导致死锁,即两个或多个线程相互等待对方释放锁,导致程序无法继续执行。

总结

synchronized关键字是Java中实现线程同步的一种机制,通过锁定对象来确保共享资源的互斥访问。正确使用synchronized可以解决多线程环境中的线程安全问题,但需要注意性能和死锁问题。在某些情况下,可能需要考虑使用其他并发工具来提高性能和灵活性。

二十、请描述什么是乐观锁和悲观锁以及它们的使用场景。

乐观锁和悲观锁是两种不同的并发控制机制,用于处理多线程环境中对共享资源的访问。它们的主要区别在于对冲突发生可能性的假设和处理方式。

悲观锁(Pessimistic Locking)

悲观锁基于一种悲观的假设,即认为冲突很可能发生,因此需要在访问共享资源时采取预防措施。以下是悲观锁的关键特点:

  1. 锁定机制:悲观锁通常通过数据库锁或编程语言中的同步机制(如Java的synchronized)实现。它在访问资源前先加锁,确保在访问期间资源不会被其他线程修改。
  2. 适用场景:当资源冲突的可能性很高时,使用悲观锁较为合适。例如,在高竞争环境下,多个线程频繁地读写同一数据。
  3. 性能影响:悲观锁可能导致线程阻塞和等待,从而影响性能。特别是在高并发情况下,锁的争用可能导致性能瓶颈。
  4. 死锁风险:使用悲观锁时,如果不当处理,可能会产生死锁。

乐观锁(Optimistic Locking)

乐观锁基于一种乐观的假设,即认为冲突不太可能发生,或者即使发生,也可以通过其他方式解决。以下是乐观锁的关键特点:

  1. 无锁机制:乐观锁通常不使用实际的锁机制。它依赖于数据版本控制或时间戳来确保在读取数据后到实际写入数据这段时间内数据未被其他线程修改。
  2. 适用场景:当资源冲突的可能性较低,或者系统更倾向于高并发性能时,使用乐观锁较为合适。例如,在低竞争环境下,或者数据更新操作不频繁的场景。
  3. 实现方式:乐观锁可以通过多种方式实现,如:
    • 版本号(Version Number):在数据表中增加一个版本号字段,每次更新数据时检查版本号是否一致,如果不一致则放弃更新并重试。
    • 时间戳(Timestamp):使用时间戳来记录数据最后更新的时间,更新时检查当前时间戳是否比数据库中的旧时间戳新。
  4. 性能优势:乐观锁通常可以提供更好的性能,因为它允许多个线程同时访问资源,只有在实际写入时才检查是否有冲突。
  5. 冲突处理:如果检测到冲突(例如,版本号不一致),乐观锁的策略通常是重试操作或回滚事务。

总结

  • 悲观锁适用于冲突可能性高的场景,通过锁定资源来预防冲突,但可能影响性能并有死锁风险。
  • 乐观锁适用于冲突可能性低的场景,通过无锁机制和数据版本控制来处理冲突,通常提供更好的并发性能,但需要合理处理冲突。

在实际应用中,选择使用乐观锁还是悲观锁取决于具体的业务场景和性能需求。有时,两者也可以结合使用,以适应不同的操作和数据访问模式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【CICID】GitHub-Actions语法

[TOC] 【CICID】GitHub-Actions语法 1 场景 ​ 当我们开发过程中,经常需要提交代码,打包,部署新代码到对应的环境,整个过程都是人工手动操作,占据开发人员大量时间,并且很繁琐容易出错。所以需要借助一些…

redis 缓存jwt令牌设置更新时间 BUG修复

大家好,今天我又又又来了,hhhhh。 上文中 我们永redis缓存了token 但是我们发现了 一个bug ,redis中缓存的token 是单用户才能实现的。 就是 我 redis中存储的键 名 为token 值 是jwt令牌 ,但是如果 用户a 登录 之后 创建一个…

LeetCode43.字符串相乘【大整数相乘】

LeetCode刷题记录 文章目录 📜题目描述💡解题思路 📜题目描述 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 注意:不能使用任何内置的 Big…

C++ 算法教程

归并排序 #include<iostream> using namespace std; template <class T> void Merge(T data[],int start,int mid,int end) {int len1 mid - start 1, len2 end - mid;int i, j, k;T* left new int[len1];T* right new int[len2];for (i 0; i < len1; i)…

数据结构--力扣104,110 二叉树相关(C

1.力扣104。二叉树的最大深度-. - 力扣&#xff08;LeetCode&#xff09; 2.力扣110。平衡二叉树->. - 力扣&#xff08;LeetCode&#xff09; 1. 叶子结点 指&#xff1a;没有子节点的节点 思路&#xff1a; 求其 左子树和右子树的最大深度&#xff0c;返回其中最大值即可…

《C语言》文件操作

文章目录 一、认识文件1、文件的概念2、程序文件3、数据文件4、文件名 三、二进制文件和文本文件四、文件的打开和关闭1、流2、标准流3、文件指针4、文件的关闭和打开 四、文件的顺序读写文件的随机读写1、fseek2、ftell3、rewind4.int origin 一、认识文件 主要讨论数据文件 1…

C++ 矩阵乘法

描述 如果A是个x行y列的矩阵&#xff0c;B是个y行z列的矩阵&#xff0c;把A和B相乘&#xff0c;其结果将是另一个x行z列的矩阵C。这个矩阵的每个元素是由下面的公式决定的 矩阵的大小不超过100*100 输入描述&#xff1a; 第一行包含一个正整数x&#xff0c;代表第一个矩阵的…

Go如何在本地引用以及发布并引用自定义工具包

如何引用本地自定义工具包 我们首先要准备两个项目&#xff0c;分别为需要引入的工具包和当前项目。 myutils、myproject1. myutils为我们的项目1-工具包 package mypakgeimport "strings"func IsContains(s string) bool {if strings.Contains(s, "a")…

Java面向对象-接口

Java面向对象-接口 一、JDK1.8之前二、接口的作用三、JDK1.8之后&#xff0c;新增非抽象方法四、静态方法 一、JDK1.8之前 1、类是类&#xff0c;接口是接口&#xff0c;它们是同一层次的概念 2、接口中没有构造器 3、接口如何声明&#xff1a;interface 4、在jdk1.8之前&…

二分查找-java代码实现(easy)

目录 一、问题描述 二、代码实现 三、刷题链接 一、问题描述 二、代码实现 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** 如果目标值存在返回下标&#xff0c;否则返…

STM32理论 —— μCOS-Ⅲ(2/2):时间管理、消息队列、信号量、任务内嵌信号量/队列、事件标志、软件定时器、内存管理

文章目录 9. 时间管理9.1 OSTimeDly()9.2 OSTimeDlyHMSM()9.3 OSTimeDlyResume()9.4 延时函数实验 10. 消息队列10.1 创建消息队列函数OSQCreate()10.2 发送消息到消息队列函数(写入队列)OSQPost()10.3 获取消息队列中的消息函数(读出队列)OSQPend()10.4 消息队列操作实验 11. …

使用React和GraphQL进行CRUD:完整教程与示例

在本教程中&#xff0c;我们将向您展示如何使用GraphQL和React实现简单的端到端CRUD操作。我们将介绍使用React Hooks读取和修改数据的简单示例。我们还将演示如何使用Apollo Client实现身份验证、错误处理、缓存和乐观UI。 什么是React&#xff1f; React是一个用于构建用户…

Unity 3D 物体的Inspector面板

1、Transform&#xff1a;位置、旋转、大小 2、Mesh Filter&#xff1a;物体的形状 3、Mesh Renderer&#xff1a;物体渲染&#xff08;物体的衣服&#xff09; 4、Collider&#xff1a;碰撞体

PyTorch计算机视觉入门:测试模型与评估,对单帧图片进行推理

在完成模型的训练之后&#xff0c;对模型进行测试与评估是至关重要的一步&#xff0c;它能帮助我们理解模型在未知数据上的泛化能力。本篇指南将带您了解如何使用PyTorch进行模型测试&#xff0c;并对测试结果进行分析。我们将基于之前训练好的模型&#xff0c;演示如何加载数据…

Electron无感打印 静默打印(vue3 + ts + vite)

&#xff08;electron vue3 项目搭建部分 自行查找其他资源 本文只讲解Electronvue3 如何实现静默打印&#xff09; 第一步获取打印机资源 渲染端代码&#xff08;vue里面&#xff09; // 因使用了vite所以在浏览器中打开 require会报错 只能在electron中 const { ipcRender…

【gitcode】idea 在本地拉取和push本地代码到gitcode仓库

【首次使用】 1、idea 拉取代码&#xff0c;很容易这里就不记录了。 2、push代码时&#xff0c;总是弹窗登录输入在gitcode.com登录能成功。但是在idea 怎么都不成功。控制台提示 remote: HTTP Basic: Access denied fatal: Authentication failed for ******* 认证失败 3…

仲恺ZK——信计专业《软件体系结构》24年试卷回忆

以下是我在总结的复习内容&#xff0c;有需要可以参考借鉴一下。我的主页还有另外一篇复习总结《仲恺ZK——信计专业《软件体系结构》&#xff0c;两者结合起来复习&#xff0c;帮助你轻松过考试&#x1f60a;。总的来说&#xff0c;考试不会太难&#xff0c;只要你了解了各类设…

QuickLook最强大的C#开源文件预览神器

功能特点&#xff1a; 快速预览&#xff1a;用户只需选中文件并按下空格键&#xff0c;即可立即查看文件内容&#xff0c;无需打开特定应用程序或软件。 多格式支持&#xff1a;QuickLook支持预览几乎所有常见的文件类型&#xff0c;包括但不限于&#xff1a; 图像&#xff1…

SwiftUI 6.0(iOS 18)新容器视图修改器漫谈

概览 本届 WWDC 2024 观影正如火如荼的进行中&#xff0c;一片鸟语花香、枝繁叶茂的苹果树上不时结出几颗令人垂涎欲滴的美味苹果让秃头码农们欲罢不能。 如您所愿&#xff0c;在界面布局“利器” SwiftUI 这根蔓藤也长出不少喜人的果实&#xff0c;其中在 iOS 18.0 中新添加的…

mybatis-plus使用拦截器实现sql完整打印

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 在使用mybatis-plus&#xff08;mybatis&#xff09;的时候&#xff0c;往往需要…