面试:为什么synchronized是一个悲观锁

synchronized 作为悲观锁的原因

synchronized 被归类为悲观锁,主要基于其设计理念和执行机制。悲观锁的核心思想是假设并发冲突频繁发生,因此在访问共享资源前会预先加锁,确保独占访问。以下是具体原因:

默认并发冲突假设

synchronized 的设计基于最坏情况假设,即认为多线程环境下共享资源的访问必然存在竞争。这种假设导致其在操作数据前直接加锁,阻止其他线程同时访问,避免潜在的数据不一致问题。

独占式锁机制

当线程进入 synchronized 修饰的代码块或方法时,会自动获取锁(对象监视器锁),其他线程必须等待锁释放才能继续执行。这种排他性特性是悲观锁的典型表现,强调"先加锁,后操作"的保守策略。

阻塞其他线程

如果锁已被占用,其他尝试获取锁的线程会被强制阻塞(进入 BLOCKED 状态),直到锁释放。这种阻塞行为是悲观锁实现线程安全的主要手段,与乐观锁(如 CAS 机制)的非阻塞重试形成对比。

适用场景

synchronized 适合高竞争场景,如多个线程频繁修改同一数据。悲观锁的优势在于简化了并发控制逻辑,但可能带来性能开销(如线程切换、等待时间)。

与乐观锁的对比

乐观锁(如 ReentrantLock 的尝试机制或 CAS)假设冲突较少,通过版本号或重试处理冲突。而 synchronized 不提供尝试机制,直接加锁,体现其悲观锁的本质。

总结:synchronized 的悲观锁特性体现在其默认加锁行为、独占访问机制以及对并发冲突的保守处理方式上。

相关推荐
fangdengfu1233 小时前
ES分析系统各个服务日志占用量
java·前端·elasticsearch
云烟成雨TD3 小时前
Spring AI 1.x 系列【51】可观测性技术选型
java·人工智能·spring
星越华夏3 小时前
ESP32-CAM图像传输项目说明文档
java·后端·struts·esp32
Jinkxs4 小时前
Java 跨域14-Java 与区块链(Hyperledger)集成
java·开发语言·区块链
8Qi84 小时前
LeetCode 1143 & 718:最长公共子序列 / 最长重复子数组
算法·leetcode·职场和发展·动态规划
晨曦中的暮雨5 小时前
Golang速通(Javaer版)
java·开发语言·后端·golang
七老板的blog5 小时前
当 Spring StateMachine 遇见大模型:构建工业级 AI 写作流水线
java·人工智能·spring
云烟成雨TD5 小时前
Spring AI 1.x 系列【46】MCP Security 模块
java·人工智能·spring
CRMEB系统商城5 小时前
CRMEB多商户系统(Java)v2.3公测版发布
java·开发语言·人工智能·小程序·开源·php
sinat_255487815 小时前
第七部分。介绍MVC(模型-视图-控制器)模式
java·ide·http·tomcat·intellij-idea