Synchronized 相关问题(面试题)

第 5-5 课:线程安全——synchronized 和 ReentrantLock + 面试题 前面我们介绍了很多关于多线程的内容,在多线程中有一个很重要的课题需要我们攻克,那就是线程安全问题。线程安全问题指的是在多线程中,各线程之间因为同时操作所产生的数据污染或其他非预期的程序运行结果。 线程安全 1)非线程安全事例 比如 A 和 B 同时给 C 转账的问题,假设 C 原本余额有 100 元,A 给 C 转账 100 元,正在转的途中,此时 B 也给 C 转了 100 元,这个时候 A 先... 阅读详情

问 题 一 : Synchronized 用 过 吗 , 其 原 理 是 什 么 ?
  这 是 一 道 Java 面 试 中 几 乎 百 分 百 会 问 到 的 问 题 , 因 为 没 有 任 何 写 过 并
发 程 序 的 开 发 者 会 没 听 说 或 者 没 接 触 过 Synchronized。


Synchronized 是 由 JVM 实 现 的 一 种 实 现 互 斥 同 步 的 一 种 方 式 , 如 果
你 查 看 被 Synchronized 修 饰 过 的 程 序 块 编 译 后 的 字 节 码 ,会 发 现 , 被
Synchronized 修 饰 过 的 程 序 块 , 在 编 译 前 后 被 编 译 器 生 成
了 monitorenter 和 monitorexit 两 个 字 节 码 指 令 。


这 两 个 指 令 是 什 么 意 思 呢 ?
   在 虚 拟 机 执 行 到 monitorenter 指 令 时 , 首 先 要 尝 试 获 取 对 象 的 锁 :
如 果 这 个 对 象 没 有 锁 定 ,或 者 当 前 线 程 已 经 拥 有 了 这 个 对 象 的 锁 ,把 锁 的
计 数 器 +1;当 执 行 monitorexit 指 令 时 将 锁 计 数 器 -1;当 计 数 器 为 0
时 , 锁 就 被 释 放 了 。
如 果 获 取 对 象 失 败 了 ,那 当 前 线 程 就 要 阻 塞 等 待 ,直 到 对 象 锁 被 另 外 一 个
线 程 释 放 为 止 。
Java 中 Synchronize 通 过 在 对 象 头 设 置 标 记 ,达 到 了 获 取 锁 和 释 放 锁
的 目 的 。

问 题 二 :你 刚 才 提 到 获 取 对 象 的 锁 ,这 个“ 锁 ”到 底 是 什 么 ? 如 何 确 定 对
象 的 锁 ?

“ 锁 ” 的 本 质 其 实 是 monitorenter 和 monitorexit 字 节 码 指 令 的 一 个
Reference 类 型 的 参 数 , 即 要 锁 定 和 解 锁 的 对 象 。 我 们 知 道 , 使 用
Synchronized 可 以 修 饰 不 同 的 对 象 ,因 此 ,对 应 的 对 象 锁 可 以 这 么 确 定 。

1. 如 果 Synchronized 明 确 指 定 了 锁 对 象 ,比 如 Synchronized( 变 量 名 )、
Synchronized(this) 等 , 说 明 加 解 锁 对 象 为 该 对 象 。

2. 如 果 没 有 明 确 指 定 :
若 Synchronized 修 饰 的 方 法 为 非 静 态 方 法 ,表 示 此 方 法 对 应 的 对 象 为 锁
对 象 ;
若 Synchronized 修 饰 的 方 法 为 静 态 方 法 ,则 表 示 此 方 法 对 应 的 类 对 象 为
锁 对 象 。
注 意 , 当 一 个 对 象 被 锁 住 时 , 对 象 里 面 所 有 用 Synchronized 修 饰 的 方
法 都 将 产 生 堵 塞 ,而 对 象 里 非 Synchronized 修 饰 的 方 法 可 正 常 被 调 用 ,
不 受 锁 影 响 。


问 题 三 : 什 么 是 可 重 入 性 , 为 什 么 说 Synchronized 是 可 重 入 锁 ?
     可 重 入 性 是 锁 的 一 个 基 本 要 求 , 是 为 了 解 决 自 己 锁 死 自 己 的 情 况 。
比 如 下 面 的 伪 代 码 , 一 个 类 中 的 同 步 方 法 调 用 另 一 个 同 步 方 法 , 假 如
Synchronized 不 支 持 重 入 , 进 入 method2 方 法 时 当 前 线 程 获 得 锁 ,
method2 方 法 里 面 执 行 method1 时 当 前 线 程 又 要 去 尝 试 获 取 锁 , 这
时 如 果 不 支 持 重 入 , 它 就 要 等 释 放 , 把 自 己 阻 塞 , 导 致 自 己 锁 死 自 己 。对Synchronized 来 说 , 可 重 入 性 是 显 而 易 见 的 , 刚 才 提 到 , 在 执
行 monitorenter 指 令 时 ,如 果 这 个 对 象 没 有 锁 定 ,或 者 当 前 线 程 已 经 拥
有 了 这 个 对 象 的 锁( 而 不 是 已 拥 有 了 锁 则 不 能 继 续 获 取 ),就 把 锁 的 计 数
器 +1, 其 实 本 质 上 就 通 过 这 种 方 式 实 现 了 可 重 入 性 。


问 题 四 : JVM 对 Java 的 原 生 锁 做 了 哪 些 优 化 ?
   在 Java 6 之 前 , Monitor 的 实 现 完 全 依 赖 底 层 操 作 系 统 的 互 斥 锁 来 实
现 , 也 就 是 我 们 刚 才 在 问 题 二 中 所 阐 述 的 获 取 /释 放 锁 的 逻 辑 。
由 于 Java 层 面 的 线 程 与 操 作 系 统 的 原 生 线 程 有 映 射 关 系 , 如 果 要 将 一
个 线 程 进 行 阻 塞 或 唤 起 都 需 要 操 作 系 统 的 协 助 ,这 就 需 要 从 用 户 态 切 换 到
内 核 态 来 执 行 ,这 种 切 换 代 价 十 分 昂 贵 ,很 耗 处 理 器 时 间 ,现 代 JDK 中
做 了 大 量 的 优 化 。
     一 种 优 化 是 使 用 自 旋 锁 ,即 在 把 线 程 进 行 阻 塞 操 作 之 前 先 让 线 程 自 旋 等 待
     一 段 时 间 ,可 能 在 等 待 期 间 其 他 线 程 已 经 解 锁 ,这 时 就 无 需 再 让 线 程 执 行
阻 塞 操 作 , 避 免 了 用 户 态 到 内 核 态 的 切 换 。
现 代 JDK 中 还 提 供 了 三 种 不 同 的 Monitor 实 现 ,也 就 是 三 种 不 同 的 锁 :
偏 向 锁 ( Biased Locking)
轻 量 级 锁
重 量 级 锁
  这 三 种 锁 使 得 JDK 得 以 优 化 Synchronized 的 运 行 ,当 JVM 检 测 到
  不 同 的 竞 争 状 况 时 ,会 自 动 切 换 到 适 合 的 锁 实 现 ,这 就 是 锁 的 升 级 、降 级 。
当 没 有 竞 争 出 现 时 , 默 认 会 使 用 偏 向 锁 。
  JVM 会 利 用 CAS 操 作 ,在 对 象 头 上 的 Mark Word 部 分 设 置 线 程 ID,
  以 表 示 这 个 对 象 偏 向 于 当 前 线 程 ,所 以 并 不 涉 及 真 正 的 互 斥 锁 ,因 为 在 很
  多 应 用 场 景 中 ,大 部 分 对 象 生 命 周 期 中 最 多 会 被 一 个 线 程 锁 定 ,使 用 偏 斜
  锁 可 以 降 低 无 竞 争 开 销
。

如 果 有 另 一 线 程 试 图 锁 定 某 个 被 偏 斜 过 的 对 象 , JVM 就 撤 销 偏 斜 锁 , 切
换 到 轻 量 级 锁 实 现 。

轻 量 级 锁 依 赖 CAS 操 作 Mark Word 来 试 图 获 取 锁 , 如 果 重 试 成 功 ,
就 使 用 普 通 的 轻 量 级 锁 ; 否 则 , 进 一 步 升 级 为 重 量 级 锁 。


问 题 五 : 为 什 么 说 Synchronized 是 非 公 平 锁 ?
非 公 平 主 要 表 现 在 获 取 锁 的 行 为 上 ,并 非 是 按 照 申 请 锁 的 时 间 前 后 给 等 待
线 程 分 配 锁 的 ,每 当 锁 被 释 放 后 ,任 何 一 个 线 程 都 有 机 会 竞 争 到 锁 ,这 样
做 的 目 的 是 为 了 提 高 执 行 性 能 , 缺 点 是 可 能 会 产 生 线 程 饥 饿 现 象 。

 

信号处理领域的研究生看过来:手把手教你搞定ICASSP 2025论文投稿(附Latex模板与格式检查清单) 本文为信号处理领域研究生提供ICASSP 2025论文投稿的详细指南,涵盖Latex模板使用、格式检查清单及投稿流程。特别针对IEEE旗舰会议的严格要求和2025年可能出现的新变化,提供预判性建议和实战技巧,帮助作者高效完成论文投稿。 阅读详情

相关推荐

Arduino程序设计(十四)舵机控制实验(SG90)

本文介绍SG90舵机控制原理及实验,主要内容有:1、介绍SG90舵机;2、舵机0°~180°来回转动;3、串口控制舵机转动固定角度。(1)舵机是一种位置(角度)伺服的驱动器。舵机只是一种通俗的叫法,其实质是一个伺服马达。在需要角度不断变化并可以保持的控制系统中应用广泛。如遥控机械人、飞机模型等。(2)舵机的转动角度为0~180°,其内部结构包括电机,控制电路和机械结构三部分。电机有三根线引出,分别接VCC、GNG和信号线。

Alice的博客 1万+

【面试题】sychronized

Synchronized是一个同步关键字,在某些多线程场景下,如果不进行同步会导致数据不安全,而Synchronized关键字就是用于代码同步。什么情况下会数据不安全呢,要满足两个条件:一是数据共享(临界资源),二是多线程同时访问并改变该数据。修饰静态方法(锁当前类):对当前类的Class对象加锁 修饰实例方法(锁当前对象实例):对当前实例对象this加锁 修饰代码块(锁指定对象/类):synchronized(object) 表示进入同步代码库前要获得 给定对象的锁。 synchronized(类.cla

yzx3105的博客 811

强化学习:Distributed PPO (DPPO) 学习笔记

DPPO = Distributed + Proximal Policy Optimization Distributed:多个智能体并行训练 Proximal:限制策略更新幅度,确保稳定性 Policy Optimization:基于策略梯度的优化方法 核心思想:多个智能体并行探索环境,共享经验,通过裁剪策略更新确保训练稳定

只是个人学习笔记 1332

synchronized 常见面试题总结

在多线程编程中,有时候需要保证多个线程对某个共享资源(如变量、方法或对象)的访问是互斥的,即同一时刻只能有一个线程访问该资源,其他线程需要等待。这种情况下,就需要使用同步机制来实现线程的同步和互斥。Synchronized是Java提供的一种同步机制,它能够保证在同一时刻只有一个线程能够进入synchronized代码块或方法,从而避免了多个线程同时访问共享资源的问题,保证了线程安全和程序的正确性。

m0_51431003的博客 1616

宽带阻抗匹配的工程实现-第一步,端口驻波仿真

其实阻抗匹配我工作以来经常说,也经常做,但是基本上都是直接在印制板上进行调试。现在想先用仿真软件直接设计出来,才发现很多东西嘴上说容易,想做出来太难了。所以准备写一些文章,记录一下碰到的问题。

pp_0604的博客 2379

【Linux内核】Linux内核裁剪完全指南:从理论到实战的系统优化

在嵌入式设备、专用服务器和物联网系统日益普及的今天,如何让Linux系统在资源受限的环境中高效运行成为开发者必须面对的问题。Linux内核裁剪正是解决这一问题的关键技术,它通过移除不必要的内核组件,打造出更精简、更安全、更高效的自定义操作系统。本文将系统全面地介绍Linux内核裁剪的完整流程和实用技巧,帮助您掌握这一核心技能。Linux内核裁剪是一项结合技术知识与实践经验的系统工程。明确需求:裁剪前必须清晰了解目标系统的硬件配置和功能需求。循序渐进:采取小步修改、反复测试的策略,避免一次性大幅修改。

撬动未来的支点的专栏 1391

synchronized面试题

一 什么会需要synchronized?什么场景下使用synchronized? 如上图所示,比如在王者荣耀程序中,我们队有二个线程分别统计后裔和安琪拉的经济,A线程从内存中read 当前队伍总经济加载到线程的本地栈,进行 +100 操作之后,这时候B线程也从内存中取出经济值 + 200,将200写回内存,B线程刚执行完,后脚A线程将100 写回到内存中,就出问题了,我们队的经济应该是300, 但是内存中存的却是100。 1.synchronized 怎么解决这个问题的? 在访问竞态资源时加..

qq_34823218的博客 4883

02-基于ART-PI开发板创建USB CDC 虚拟串口设备

本例在ART-PI开发板上,基于RT-Thread 5.0,5虚拟了一个USB32 CDC串口设备。

arm_fan的专栏 1886

最全的 synchronized 面试题解析

1)当持有锁的线程释放锁时,该线程会执行以下两个重要操作:先将锁的持有者owner属性赋值为 null。唤醒等待链表中的一个线程(假定继承者)。在1和2之间,如果有其他线程刚好在尝试获取锁(例如自旋),则可以马上获取到锁。2)当线程尝试获取锁失败,进入阻塞时,放入链表的顺序,和最终被唤醒的顺序是不一致的,也就是说你先进入链表,不代表你就会先被唤醒所谓的匿名偏向是指该锁从未被获取过,也就是第一次偏向,此时的特点是锁对象markword的线程 ID 为0。

java_2017_csdn的博客 716

智能安防摄像头埋点实践:用户行为与设备状态的闭环监控(含AI事件)

智能安防摄像头埋点闭环体系设计及应用实践 摘要: 本文系统阐述了智能安防摄像头埋点闭环体系的设计与实践。首先分析了传统埋点的不足及闭环埋点的价值,提出由用户行为埋点、设备状态埋点和AI事件埋点构成的三维埋点体系框架。详细介绍了闭环监控的四大流程:数据采集、汇聚清洗、分析建模和智能决策。通过误报优化、个性化策略等案例展示了AI事件闭环的实际应用价值,并探讨了隐私合规、性能优化等关键挑战的解决思路。最后展望了端侧AI增强、预测型埋点等未来发展趋势。该体系实现了从数据采集到业务决策的完整闭环,有效提升了AI模型性

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 1050

【ArcGIS微课1000例】0066:图像融合(全色+多光谱)操作案例教程

图像融合是指将不同类型传感器的影像进行融合,既能使图向具有较高的空间分辨率,又具有多光谱的特性。除了遥感软件如Erdas能进行图像融合,ArcGIS软件也可以进行图像融合等图像增强操作。

智慧空间实验室 3081

【面试】Synchronized常见面试题

问题大纲一、为什么有Synchronized?二、Synchronized是什么?三、Synchronized怎么实现的?四、Synchronized使用?五、Synchronized延申?3、synchronized底层如何实现?(*4)什么是锁的升级、降级?【第16讲】追问1:Synchronized对于非静态方法和静态方法加锁的区别是什么?追问2:Java 使用Synchronized关键字有什么隐患?追问3:Synchronized和lock的区别(*3)四、参考 一、为什么有Synchronize

HeavenDan的博客 3040

ROS从入门到精通1-1:ROS核心架构、常用指令与计算图

本文介绍ROS的核心架构,各个文件、目录的用途、常用命令行工具、动态计算图原理。

FRIGIDWINTER的博客 6372

大厂架构师经验分享!还在找TCP-IP的相关文章?极其重要

前言 现在Java程序员面试都是因为没有丰富的工作经验和自己过硬的技术,所有都不知道一般互联网应该会问什么技术问题,加上自己可能去面试的时候没有准备的太充分,一面试刚跟面试官扯几个面试题就不知道自己在哪里了,被怼的体无完肤了,最后以灰头土脸的结束,所有针对这类的读者,我把几个群友大厂面试时候的经历和面试题整理出来,再次分享给广大的朋友们去参考,让你们更加的了解一线大厂都是问的什么问题。 01 并发宝典:面试专题 面试专题分为四个部分,分别如下 Synchronized 相关问题 可重入锁 Reen

m0_56662269的博客 346

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

15个多线程相关的面试题【建议收藏】

15个多线程相关的面试题【建议收藏】

小二丶的博客 2930

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java并发编程面试题(二)

不是,它包括三个步骤1.从内存中读取i的值2.对i进行+1操作3.将新的值写回内存。

m0_73971785的博客 1318

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java面试题--3并发篇-02 __八股文 备战春招,秋招

synchronized 的非公平其实在源码中应该有不少地方,因为设计者就没按公平锁来设计,核心有以下几个点:先将锁的持有者 owner 属性赋值为 null唤醒等待链表中的一个线程(假定继承者)。在1和2之间,如果有其他线程刚好在尝试获取锁(例如自旋),则可以马上获取到锁。2)当线程尝试获取锁失败,进入阻塞时,放入链表的顺序,和最终被唤醒的顺序是不一致的,也就是说你先进入链表,不代表你就会先被唤醒。

weixin_64942806的博客 1519

Java之线程篇六

CAS,synchronized原理,Callable,JUC,信号量等。

. 1万+

深入解析锁策略与synchronized原理与CAS原理详解

1、常见的锁策略:悲观锁 vs 乐观锁、重量级锁 vs 轻量级锁、挂起等待锁 vs 自旋锁、普通互斥锁 vs 读写锁、可重入锁 vs 不可重入锁、公平锁 vs 非公平锁。 2、synchronized的原理:JVM 将 synchronized 锁分为 无锁、偏向锁、轻量级锁、重量级锁 状态。会根据情况,进行一次升级。 3、CASL:全称为:compare and swap,也就是 "比较并交换",一个CAS涉及下述操作: 1)比较 A 和 V 是否相等。(比较) 2)如果比较相等,将 B 写入 V。(

2303_80388948的博客 1788

Java多线程相关的面试题

wait让线程等待,notify唤醒一个等待线程,notifyAll唤醒所有等待线程,用于线程间通信。竞态条件是多个线程访问共享资源时,因执行顺序不同导致结果不一致的情况,避免方法是使用同步机制。死锁是两个或多个线程互相等待对方释放资源的状态,避免死锁可通过控制锁的获取顺序等方法。98. 什么是线程的getPriority?线程getPriority的作用是什么?线程setPriority的作用是什么?92. 什么是线程的wait、notify、notifyAll?74. 什么是Callable?

坚持写博客,大家的关注是我前进的动力! 579

线程同步机制synchronized

线程同步机制synchronized 如果有一部分代码必须是线程排队的,不能并发。一个线程把这里的代码全部执行结束之后,另一个线程才能进来。需要使用线程同步机制 线程同步机制的语法是: 使用同步代码块的方式,这种方式比较灵活。修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象; synchronized(线程共享对象){ // 线程同步代码块。 } 在实例方法上使用synchronized,例如: synchronize

Avices 478

wait()怎么知道等待的资源到达了?

全网最硬核的 synchronized 面试题深度解析

weixin_49324263的博客 201

多线程同步互斥实例——使用synchronized实现线程通信和互斥

线程互斥概念       线程互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 实现线程同步互斥的四种方式       临界区(Critical Section):适合一个进程内的多线程访问公共区域或代码段时使用       互斥量 (Mutex):适合不同进程内多线程访问公共区域或代码段时使用

IT小白 6949

Java全栈经典面试题剖析8】JavaSE高级 -- 线程同步、 线程通信、死锁、线程池

竞争不激烈的情况下,synchronized性能好一点,因为synchronized有个锁升级机制,根据竞争激烈程序给锁升级,从偏向锁到轻量级锁再到重量级锁,而到重量级锁的转换需要操作系统帮忙,需要花费较多时间。通过Object类的wait()、notify()、notifyAll(),以及Thread类的join()方法,可以进行消息传递,实现让线程等待或唤醒线程,2.同步锁引发的阻塞可以通过减少锁持有时间,读写锁分离,减小锁的粒度,锁分离,锁粗化等方式来优化锁的性能。

look_outs的博客 899

Java并发编程常见面试题总结

梳理Java并发编程相关的面试题,主要参考《JAVA并发编程实战》(Brian Goetz, Joshua Bloch, David Holmes, Tim Peierls, Joseph Bowbeer, Doug Lea 著, 韩锴, 方妙 译)一书,其余部分整合网络相关内容。

云原生Java Web领域技术博客 860

java面试题:谈谈你对volatile的理解

一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。

2401_84047990的博客 723
上一篇: Java中比较运算符compareTo()、equals()与==的区别及应用总结
下一篇: SpringMVC详细示例实战教程(一)
「已注销」
博客等级 码龄5年 6粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值