自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:單核服務(wù)器可以不加鎖嗎?

開發(fā) 前端
因?yàn)樵趩魏朔?wù)器上也會(huì)有線程切換,如果不加鎖,那么線程切換后,另一個(gè)線程就可以訪問其他線程未操作完的共享變量,這就會(huì)導(dǎo)致操作的共享變量發(fā)生數(shù)據(jù)覆蓋的問題,所以是需要加鎖。

今天有位同學(xué)問了磊哥一個(gè)問題,大概的意思是“單核服務(wù)器可以不加鎖嗎?”,我覺得很有意思,所以在這里就和各位探討一下:

1. 問題答案

先說我的理解,單核服務(wù)器仍然需要加鎖。

因?yàn)樵趩魏朔?wù)器上也會(huì)有線程切換,如果不加鎖,那么線程切換后,另一個(gè)線程就可以訪問其他線程未操作完的共享變量,這就會(huì)導(dǎo)致操作的共享變量發(fā)生數(shù)據(jù)覆蓋的問題,所以是需要加鎖。

例如,以下案例,線程 T1 和線程 T2 都要執(zhí)行 i++ 操作,i 的初始值為 0,所以正確的執(zhí)行結(jié)果應(yīng)該是 2。但如果不加鎖,即使在單核服務(wù)器下也會(huì)造成數(shù)據(jù)覆蓋問題,最終的執(zhí)行結(jié)果為 1 的情況,具體執(zhí)行流程如下:

2. 原因分析

因?yàn)?i++ 并不是原子操作,它的執(zhí)行要分為以下 3  步:

  • 查詢 i 的值。
  • 執(zhí)行 i+1 修改操作。
  • 將結(jié)果賦值給 i 變量。

如果是加鎖操作,那么線程可以一個(gè)個(gè)執(zhí)行,首先某一個(gè)線程先把 i 修改為 1,然后另一個(gè)線程再次基礎(chǔ)上將結(jié)果修改為 2。

但如果不加鎖,那么就會(huì)導(dǎo)致下面的問題:


線程 1

線程 2

t1

讀取到 i 的值為 0


t2


讀取到 i 的值為 0

t3


執(zhí)行 +1 操作,修改 i 為 1

t4


將結(jié)果 1  賦值給 i 變量

t5

執(zhí)行 +1 操作,修改 i 為 1


t6

將結(jié)果 1  賦值給 i 變量


從上述執(zhí)行流程可以看出,即使在單核服務(wù)上,依然會(huì)發(fā)生線程切換的問題。而線程切換就可能會(huì)導(dǎo)致數(shù)據(jù)覆蓋的問題,這就是線程安全問題,所以單核服務(wù)器也要加鎖。

責(zé)任編輯:姜華 來源: 磊哥和Java
相關(guān)推薦

2020-08-10 07:49:51

服務(wù)器

2022-10-10 12:31:37

服務(wù)器性能

2024-07-22 14:09:22

@AsyncJava

2023-08-13 16:17:31

2023-07-11 16:01:47

共享數(shù)據(jù)開發(fā)

2020-10-15 06:26:24

高并發(fā)場景冰河

2022-07-26 08:40:42

Java并發(fā)工具類

2022-08-02 06:31:32

Java并發(fā)工具類

2019-07-24 11:52:11

CPU服務(wù)器面試官

2022-07-11 10:47:46

容器JAVA

2024-03-12 14:36:44

微服務(wù)HTTPRPC

2022-06-30 08:14:05

Java阻塞隊(duì)列

2015-08-13 10:29:12

面試面試官

2022-05-23 08:43:02

BigIntJavaScript內(nèi)置對象

2021-09-08 08:06:57

Redis原子性數(shù)據(jù)類型

2021-04-12 21:34:29

Redis故障數(shù)據(jù)

2024-01-10 15:27:58

SessionCookieWeb 應(yīng)用

2020-05-11 14:55:44

CSS鼠標(biāo)前端

2023-02-26 17:21:21

2022-07-15 08:22:42

對象符串鍵Symbol
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號