整理好了!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.mzph.cn/web/28279.shtml

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

相关文章

分类模型部署-ONNX

分类模型部署-ONNX 0 引入:1 模型部署实战测试:1 安装配置环境:2 Pytorch图像分类模型转ONNX-ImageNet1000类3 推理引擎ONNX Runtime部署-预测单张图像: 2 扩展阅读参考 0 引入: 在软件工程中,部署指把开发…

kubeadm快速部署K8S

目录 一、kubeadm安装K8S 1.1 环境准备 1.2 初始化配置 1.3 所有节点安装docker 1.3.1 安装依赖环境和docker 1.3.2 定义docker 配置文件 1.3.3 重启并开机自启docker 1.3.4 查看docker 是否配置成功 1.4 master、node01 、node02安装kubeadm,kubelet和kub…

2.线上论坛项目

一、项目介绍 线上论坛 相关技术:SpringBootSpringMvcMybatisMysqlSwagger项目简介:本项目是一个功能丰富的线上论坛,用户可编辑、发布、删除帖子,并评论、点赞。帖子按版块分类,方便查找。同时,用户可以…

图像处理:Python使用OpenCV进行图像锐化 (非锐化掩模、拉普拉斯滤波器)

文章目录 非锐化掩模 (Unsharp Masking)拉普拉斯滤波器 (Laplacian Filter)效果对比总结 在图像处理中,锐化操作用于增强图像的边缘和细节,使图像看起来更清晰。常见的图像锐化方法包括非锐化掩模(Unsharp Masking)和拉普拉斯滤波…

轻松实现H5页面下拉刷新:滑动触发、高度提示与数据刷新全攻略

前段时间在做小程序到H5的迁移,其中小程序中下拉刷新的功能引起了产品的注意。他说到,哎,我们迁移后的H5页面怎么没有下拉刷新,于是乎,我就急忙将这部分的内容给填上。 本来是计划使用成熟的组件库来实现,…

Windows修改CMD窗口编码为UTF-8

windows下的cmd的默认编码是GBK编码,有时可能造成乱码问题,下面是我找到的两种更换编码方式为UTF-8的方法。 1、临时修改 (1)先进入cmd命令窗口(快捷键win键R) (2)直接输入“chcp…

[Day 12] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

機器學習與深度學習介紹 機器學習和深度學習是當今人工智能領域的兩個核心技術,它們不僅在學術界引起了廣泛的關注,也在產業界掀起了革新浪潮。本篇文章將深入探討這兩者的基本概念、技術原理及其在現實世界中的應用。 1. 機器學習(Machine…

畅想智能美颜工具的未来:美颜SDK技术详解

美颜SDK作为技术的核心,承载了美颜工具的实现和创新。本篇文章,小编将深入探讨美颜SDK技术的细节。 一、技术原理 美颜SDK是一种软件开发工具包,集成了一系列图像处理算法和技术,旨在实现对照片和视频中人物的实时美化。其主要技…

Python爬虫实现“自动重试”机制的方法(2)

前言 本文是该专栏的第30篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏上一篇文章《Python爬虫实现“自动重试”机制的方法(1)》中,笔者有详细介绍在爬虫项目中添加“自动重试”机制的方法,而在本文中,笔者将再次介绍另外一种“自动重试”的实现方法。 具…

22.1 正则表达式-定义正则表达式、正则语法

1.定义正则表达式 正则表达式意在描述隐藏在数据中的某种模式或规则。 例如:下面的几个字符串看似各不相同: slimshady999roger1813Wagner但看似不同的数据却隐藏着相同的特征: 仅由英语字母和数字组成英语字母有小写也有大写总字符数介于 …

Mysql--基础知识点--86--慢查询

1 判断是不是网络、接口问题; 2 若不是网络接口问题,查看服务器性能cpu、内存、硬盘。若mysql的cpu很高则表示读写频率高,若网站的访问量又不高,则可能是(1)mysql参数问题;(2)linux系统参数;(3)mysql的sql语…

逢3必过报数游戏-第13届蓝桥杯省赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第84讲。 逢3必过报数游戏&…

c++_0基础_讲解7 练习

这一讲我为大家准备了几道题目,大家试着独自做一下(可能来自不同网站) 整数大小比较 - 洛谷 题目描述 输入两个整数,比较它们的大小。若 x>yx>y ,输出 > ;若 xyxy ,输出 &#xff…

---异常---

我们在运行程序时总遇到各种与报错,数组越界,空指针的引用,这些在java中都称为异常 对于不同的错误都具有一个与他对应的异常类来秒描述 这是对于数组越界这个类里有的方法,这些是描述异常的 在java中有一个完整的描述异常的类的…

嵌入式数据库的一般架构

嵌入式数据库的架构与应用对象紧密相关,其架构是以内存、文件和网络等三种方式为主。 1.基于内存的数据库系统 基于内存的数据库系统中比较典型的产品是每个McObject公司的eXtremeDB嵌入式数据库,2013年3月推出5.0版,它采用内存数据结构&…

2024年黑龙江省特岗招聘公告出了!!!

2024年黑龙江省农村义务教育阶段学校特设岗位教师招聘822人公告 (1、网上报名 时间:6月17日9:00—6月22日17:00。 网址: https://sfyz.hljea.org.cn:7006/tgjs 2、网上资格审查 资格审查时间:6月…

英语学习笔记36——Where ... ?

Where … ? ……在哪里? 词汇 Vocabulary beside prep. 在……旁边 同义词: near by 构成:be side side n. 边 搭配:side walk 人行道 例句:Bobby在我旁边。    Bobby is beside me. off prep. 离开&#xff…

C/C++中内存开辟与柔性数组

C/C中内存的开辟 在C中,我们都知道有三个区: 1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结 束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指…

使用itextPDF实现PDF电子公章工具类

一、制作公章 在线网站:印章生成器 - Kalvin在线工具 (kalvinbg.cn) 然后对公章进行下载保存 盖章图片: 二、生成数字签名 2.1: java工具keytool生成p12数字证书文件 Keytool是用于管理和证书的工具,位于%JAVA_HOME%/bin目录。…

代码随想录——组合总数Ⅲ(Leetcode216)

题目链接 回溯 class Solution {List<List<Integer>> res new ArrayList<List<Integer>>();List<Integer> list new ArrayList<Integer>();public List<List<Integer>> combinationSum3(int k, int n) {backtracking(k, …