在jvm的世界里,線程就像不相干的平行空間,串行在虛擬機(jī)中,那么java如何保證線程安全?
并發(fā)(concurrency)一個(gè)并不陌生的詞,簡(jiǎn)單來(lái)說(shuō),就是cpu在同一時(shí)刻執(zhí)行多個(gè)任務(wù)。而Java并發(fā)則由多線程實(shí)現(xiàn)的。在jvm的世界里,線程就像不相干的平行空間,串行在虛擬機(jī)中,那么java如何保證線程安全?
保證類線程安全的措施:
不共享線程間的變量;
設(shè)置屬性變量為不可變變量;
每個(gè)共享的可變變量都使用一個(gè)確定的鎖保護(hù);
1.保證線程安全的思路:
通過(guò)架構(gòu)設(shè)計(jì)
通過(guò)上層的架構(gòu)設(shè)計(jì)和業(yè)務(wù)分析來(lái)避免并發(fā)場(chǎng)景。比如需要用多線程或分布式集群統(tǒng)計(jì)一堆用戶的相關(guān)統(tǒng)計(jì)值,由于用戶的統(tǒng)計(jì)值是共享數(shù)據(jù),因此需要保證線程安全。從業(yè)務(wù)上分析出用戶之間的數(shù)據(jù)并不共享,因此可以設(shè)計(jì)一個(gè)規(guī)則來(lái)保證一個(gè)用戶的計(jì)算工作和數(shù)據(jù)訪問(wèn)只被一個(gè)線程或一臺(tái)機(jī)器完成,這樣從設(shè)計(jì)上避免了接下來(lái)可能的并發(fā)問(wèn)題。
2.保證類無(wú)狀態(tài):
有狀態(tài)會(huì)限制橫向擴(kuò)展能力,也可能產(chǎn)生并發(fā)問(wèn)題。如果類是無(wú)狀態(tài)的,那它永遠(yuǎn)是線程安全的。因此在設(shè)計(jì)階段盡可能用無(wú)狀態(tài)的類來(lái)滿足業(yè)務(wù)需求。
3.區(qū)別原子操作和復(fù)合操作:
常見(jiàn)的復(fù)合操作包括check-then-act, i++等。
雖然check-then-act從表面上看很簡(jiǎn)單,但卻普遍存在與我們?nèi)粘5拈_發(fā)中,特別是在數(shù)據(jù)庫(kù)存取這一塊。比如我們需要在數(shù)據(jù)庫(kù)里存一個(gè)客戶的統(tǒng)計(jì)值,當(dāng)統(tǒng)計(jì)值不存在時(shí)初始化,當(dāng)存在時(shí)就去更新。如果不把這組邏輯設(shè)計(jì)為原子性的就很有可能產(chǎn)生出兩條這個(gè)客戶的統(tǒng)計(jì)值。
佰佰安全網(wǎng)提醒您:為了保障自己的安全,在網(wǎng)絡(luò)中一定要實(shí)施網(wǎng)絡(luò)安全防范措施與應(yīng)用措施,另外多學(xué)習(xí)一些網(wǎng)絡(luò)安全常識(shí)和網(wǎng)絡(luò)安全技術(shù)知識(shí)也是非常重要的。
責(zé)任編輯:張小付
2022.11.23 12:03:03
2022.11.23 12:01:33
2022.11.23 11:59:38
2022.11.23 11:58:34
2022.11.23 11:57:16
2022.11.16 20:44:07
07/17如何安全避孕?
07/16在網(wǎng)絡(luò)上發(fā)表過(guò)激言論有什么危害?
04/10網(wǎng)絡(luò)安全防范措施與應(yīng)用
04/18物業(yè)安全管理主要包括哪些方面?
06/26學(xué)校安全教育的好處
02/15商場(chǎng)超市有哪些安全隱患?