365bet中文官方网站

面试官:单核服务器可以不加锁吗?

📅 2026-07-27 09:43:30 👤 admin 👁️ 8568 🏷️ 545

今天有位同学问了磊哥一个问题,大概的意思是“单核服务器可以不加锁吗?”,我觉得很有意思,所以在这里就和各位探讨一下:

1. 问题答案

先说我的理解,单核服务器仍然需要加锁。

因为在单核服务器上也会有线程切换,如果不加锁,那么线程切换后,另一个线程就可以访问其他线程未操作完的共享变量,这就会导致操作的共享变量发生数据覆盖的问题,所以是需要加锁。

例如,以下案例,线程 T1 和线程 T2 都要执行 i++ 操作,i 的初始值为 0,所以正确的执行结果应该是 2。但如果不加锁,即使在单核服务器下也会造成数据覆盖问题,最终的执行结果为 1 的情况,具体执行流程如下:

2. 原因分析

因为 i++ 并不是原子操作,它的执行要分为以下 3 步:

查询 i 的值。

执行 i+1 修改操作。

将结果赋值给 i 变量。

如果是加锁操作,那么线程可以一个个执行,首先某一个线程先把 i 修改为 1,然后另一个线程再次基础上将结果修改为 2。

但如果不加锁,那么就会导致下面的问题:

线程 1

线程 2

t1

读取到 i 的值为 0

t2

读取到 i 的值为 0

t3

执行 +1 操作,修改 i 为 1

t4

将结果 1 赋值给 i 变量

t5

执行 +1 操作,修改 i 为 1

t6

将结果 1 赋值给 i 变量

从上述执行流程可以看出,即使在单核服务上,依然会发生线程切换的问题。而线程切换就可能会导致数据覆盖的问题,这就是线程安全问题,所以单核服务器也要加锁。

课后思考

除了锁机制外,还有哪些手段可以保证线程安全?

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

相关推荐

威胁情报相关文章/书籍

威胁情报平台 | 公众号 | 个人号(偏APT方向)国内启明星辰VenusEye威胁情报中心安天国家网络威胁情报共享开放平台微步安恒腾讯腾讯安全威胁

世界杯个人奖项全解析及金球奖与银球奖的关系探讨

本篇文章将深入探讨世界杯个人奖项的各个方面,尤其是金球奖和银球奖之间的关系。文章首先回顾世界杯历史上重要的个人奖项,分析其评选

肉毒素除皱针能保持多久

肉毒素除皱针的效果通常能够保持4-12个月,具体维持时间受多种因素影响,比如注射类型与品牌、注射剂量与次数、个体差异与代谢速度、注射