首页 > 极客资料 博客日记
面试官:单核服务器可以不加锁吗?
2024-09-18 09:30:03极客资料围观21次
文章面试官:单核服务器可以不加锁吗?分享给大家,欢迎收藏极客之家,专注分享技术知识
今天有位同学问了磊哥一个问题,大概的意思是“单核服务器可以不加锁吗?”,我觉得很有意思,所以在这里就和各位探讨一下:
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、设计模式、消息队列等模块。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- Nuxt.js 应用中的 prerender:routes 事件钩子详解
- 【问题解决】Tomcat由低于8版本升级到高版本使用Tomcat自带连接池报错无法找到表空间的问题
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit
- 六、Spring Boot集成Spring Security之前后分离认证流程最佳方案
- 《JVM第7课》堆区
- .NET 8 高性能跨平台图像处理库 ImageSharp
- 还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!
- 刚毕业,去做边缘业务,还有救吗?
- 如何避免 HttpClient 丢失请求头:通过 HttpRequestMessage 解决并优化
- 让性能提升56%的Vue3.5响应式重构之“版本计数”