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

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

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

1. 问题答案

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

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

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

2. 原因分析

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

  1. 查询 i 的值。
  2. 执行 i+1 修改操作。
  3. 将结果赋值给 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、设计模式、消息队列等模块。

相关文章
|
30天前
|
JavaScript 前端开发 应用服务中间件
【Vue面试题三十】、vue项目本地开发完成后部署到服务器后报404是什么原因呢?
这篇文章分析了Vue项目在服务器部署后出现404错误的原因,主要是由于history路由模式下服务器缺少对单页应用的支持,并提供了通过修改nginx配置使用`try_files`指令重定向所有请求到`index.html`的解决方案。
【Vue面试题三十】、vue项目本地开发完成后部署到服务器后报404是什么原因呢?
|
5天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
29天前
|
存储 安全 容器
【多线程面试题二十一】、 分段锁是怎么实现的?
这篇文章解释了分段锁的概念和实现方式,通过将数据分成多个段并在每段数据上使用独立锁,从而降低锁竞争,提高并发访问效率,举例说明了`ConcurrentHashMap`如何使用分段锁技术来实现高并发和线程安全。
【多线程面试题二十一】、 分段锁是怎么实现的?
|
29天前
|
安全 Java
【多线程面试题十九】、 公平锁与非公平锁是怎么实现的?
这篇文章解释了Java中`ReentrantLock`的公平锁和非公平锁的实现原理,其中公平锁通过检查等待队列严格按顺序获取锁,而非公平锁允许新线程有更高机会立即获取锁,两者都依赖于`AbstractQueuedSynchronizer`(AQS)和`volatile`关键字以及CAS技术来确保线程安全和锁的正确同步。
【多线程面试题十九】、 公平锁与非公平锁是怎么实现的?
|
1月前
|
设计模式 消息中间件 安全
面试官:说说读写锁的实现原理?
面试官:说说读写锁的实现原理?
49 1
|
1月前
|
安全 Go 调度
[go 面试] 深入理解并发控制:掌握锁的精髓
[go 面试] 深入理解并发控制:掌握锁的精髓
|
29天前
|
缓存 Java
【多线程面试题二十三】、 说说你对读写锁的了解volatile关键字有什么用?
这篇文章讨论了Java中的`volatile`关键字,解释了它如何保证变量的可见性和禁止指令重排,以及它不能保证复合操作的原子性。
|
29天前
|
Java
【多线程面试题二十二】、 说说你对读写锁的了解
这篇文章讨论了读写锁(ReadWriteLock)的概念和应用场景,强调了读写锁适用于读操作远多于写操作的情况,并介绍了Java中`ReentrantReadWriteLock`实现的读写锁特性,包括公平性选择、可重入和可降级。
|
29天前
|
前端开发 应用服务中间件 API
"揭秘!面试官必问:你是如何巧妙绕过跨域难题的?前端代理VS服务器端CORS,哪个才是你的秘密武器?"
【8月更文挑战第21天】在软件开发中,尤其前后端分离架构下,跨域资源共享(CORS)是常见的挑战。主要解决方案有两种:一是服务器端配置CORS策略,通过设置响应头控制跨域访问权限,无需改动前端代码,增强安全性;二是前端代理转发,如使用Nginx或Webpack DevServer在开发环境中转发请求绕过同源策略,简化开发流程但不适用于生产环境。生产环境下应采用服务器端CORS策略以确保安全稳定。
27 0
|
29天前
|
算法 Java 调度
【多线程面试题二十】、 如何实现互斥锁(mutex)?
这篇文章讨论了在Java中实现互斥锁(mutex)的两种方式:使用`synchronized`关键字进行块结构同步,以及使用`java.util.concurrent.locks.Lock`接口进行非块结构同步,后者提供了更灵活的同步机制和扩展性。