摘要:線程安全嗎雖然天天用,但是真的沒(méi)考慮過(guò)這個(gè)問(wèn)題。其實(shí),線程不安全。沒(méi)有對(duì)多線程問(wèn)題進(jìn)行處理,舉個(gè)方法的例子就能證明它線程不安全。線程不安全的要比線程安全的執(zhí)行效率高。
引言
最近學(xué)校的氛圍比較活躍,考研的復(fù)習(xí),不考研的都在寫(xiě)簡(jiǎn)歷準(zhǔn)備面試。
看了看,最近也沒(méi)有好公司來(lái)辦宣講會(huì),也就沒(méi)了投簡(jiǎn)歷的意向。最近看了看面試題,想著補(bǔ)一補(bǔ)基礎(chǔ),以后面幾家Spring Cloud的企業(yè),去和面試官交流交流。
Spring Cloud的學(xué)習(xí)與體會(huì)
最近看了《Spring Cloud微服務(wù)實(shí)戰(zhàn)》一書(shū),感覺(jué)受益匪淺,大有裨益。
高并發(fā)應(yīng)用,必須是要啟用Spring Cloud的。有了Spring Cloud,就不用再像之前一樣,前端工程師團(tuán)隊(duì),后端工程師團(tuán)隊(duì),運(yùn)維團(tuán)隊(duì)。而是按模塊劃分,訂單模塊團(tuán)隊(duì),支付模塊團(tuán)隊(duì),每個(gè)團(tuán)隊(duì)里都是從前端到后臺(tái)到運(yùn)維的全棧工程師。
就像上次黃庭祥說(shuō)的,ThinkPHP開(kāi)發(fā),他寫(xiě)學(xué)期管理;AngularJS開(kāi)發(fā),他又寫(xiě)學(xué)期管理;Angular開(kāi)發(fā),他還寫(xiě)學(xué)期管理。想到什么了么?肯定精通這個(gè)模塊的業(yè)務(wù)邏輯???
如果培養(yǎng)出優(yōu)秀的支付模塊團(tuán)隊(duì)、優(yōu)秀的安全模塊團(tuán)隊(duì)、優(yōu)秀的高并發(fā)優(yōu)化團(tuán)隊(duì),其實(shí)淘寶也不過(guò)如此。
相互的依賴,從原來(lái)的@Autowired轉(zhuǎn)為服務(wù)器接口間的調(diào)用。每個(gè)模塊都是一個(gè)Spring Cloud應(yīng)用,各應(yīng)用間通過(guò)互相調(diào)用、相互協(xié)作共同實(shí)現(xiàn)業(yè)務(wù)功能,同時(shí),各應(yīng)用模塊可以采用不同的數(shù)據(jù)庫(kù),以發(fā)揮各數(shù)據(jù)庫(kù)之所長(zhǎng)。
然后后臺(tái)分布式部署,到了并發(fā)的時(shí)候,給相應(yīng)的模塊加服務(wù)器負(fù)載均衡就是了。個(gè)人中心模塊,不常用,兩個(gè)服務(wù)器負(fù)載;訂單模塊,可能會(huì)并發(fā),加個(gè)百十來(lái)個(gè)服務(wù)器負(fù)載均衡。當(dāng)然,像618、雙十一這樣的場(chǎng)景,肯定不是加服務(wù)器就能解決的,我這里只是舉個(gè)簡(jiǎn)單的例子。模塊劃分之后,可以有針對(duì)性地解決高并發(fā)問(wèn)題。
不扯淡了,開(kāi)始進(jìn)入正題。
面試題 再談線程安全什么是線程安全?
我看到這道題就感覺(jué)怎么也說(shuō)不出來(lái),就是多線程的環(huán)境下運(yùn)行,我這個(gè)應(yīng)用也不炸,雖然是這個(gè)意思,但是也不能這樣回答???一時(shí)之間,找不到相關(guān)的學(xué)術(shù)詞匯回答此問(wèn)題。
這是想了許久后,我自己總結(jié)出的回答:
程序在單線程環(huán)境下正常執(zhí)行得到了正確的結(jié)果,在多個(gè)線程并發(fā)執(zhí)行的環(huán)境條件下,仍然能得到像單線程一樣正確的結(jié)果,這就是線程安全。
如果一個(gè)類(lèi)(或?qū)ο?,我們?cè)谑褂脮r(shí),無(wú)需考慮任何多線程相關(guān)的問(wèn)題,就像單線程一樣使用,且最后能得到正確的結(jié)果,那就說(shuō)這個(gè)類(lèi)(或?qū)ο?是線程安全的。
ArrayList線程安全嗎?看了許多面試題,發(fā)現(xiàn)面試官都喜歡以一個(gè)小方面進(jìn)行切入,然后無(wú)限擴(kuò)展,直到把面試者問(wèn)懵圈為止。
ArrayList線程安全嗎?
雖然天天用ArrayList,但是真的沒(méi)考慮過(guò)這個(gè)問(wèn)題。其實(shí),ArrayList線程不安全。
ArrayList是一個(gè)內(nèi)部采用數(shù)組實(shí)現(xiàn)的線性表,它相比數(shù)組最大的優(yōu)點(diǎn)就是使用時(shí)可以不用去像數(shù)組一樣new的時(shí)候去考慮要容納多少個(gè)元素。ArrayList默認(rèn)構(gòu)造一個(gè)容量為10的數(shù)組。
private static final int DEFAULT_CAPACITY = 10;
如果容量不夠了,ArrayList會(huì)自動(dòng)擴(kuò)容,擴(kuò)容至原來(lái)的1.5倍。(右移一位,相當(dāng)于除以2)。
int newCapacity = oldCapacity + (oldCapacity >> 1);
ArrayList沒(méi)有對(duì)多線程問(wèn)題進(jìn)行處理,舉個(gè)add方法的例子就能證明它線程不安全。
elementData[size++] = e;
別看這是一行,其實(shí)是執(zhí)行了兩步操作,賦值和自增。
線程A add一個(gè)元素,然后暫停執(zhí)行,size還沒(méi)自增,然后線程B再add元素,size沒(méi)變,就直接把A add的元素覆蓋了。
不安全為什么要使用?又回到了之前向晨澍請(qǐng)教的問(wèn)題,線程安全,必然是有額外開(kāi)銷(xiāo)的。
所以List的三個(gè)接口ArrayList、LinkedList和Vector。
線程不安全的要比線程安全的執(zhí)行效率高。所以我們常用的是線程不安全的ArrayList、LinkedList,而從來(lái)沒(méi)有用過(guò)線程安全的Vector。
Vector自JDK1.0就存在,設(shè)計(jì)得不夠完善,多線程情況下如果使用不當(dāng)也會(huì)發(fā)生錯(cuò)誤,不推薦使用。
如何解決線程不安全既然Vector不能用,那我就想要一個(gè)線程安全的List得怎么整呢?
調(diào)用Collections.synchronizedList方法,使ArrayList線程安全。
ListsynchronizedList = Collections.synchronizedList(new ArrayList<>());
返回SynchronizedList類(lèi)的對(duì)象,經(jīng)典的裝飾器模式,對(duì)方法訪問(wèn)加了同步。
public void add(int index, E element) { synchronized (mutex) {list.add(index, element);} } public E remove(int index) { synchronized (mutex) {return list.remove(index);} }總結(jié)
何處望神州?滿眼風(fēng)光北固樓。千古興亡多少事?悠悠。不盡長(zhǎng)江滾滾流。年少萬(wàn)兜鍪,坐斷東南戰(zhàn)未休。天下英雄誰(shuí)敵手?曹劉。生子當(dāng)如孫仲謀。
——辛棄疾 《南鄉(xiāng)子·登京口北固亭有懷》
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74497.html
摘要:常用集合使用場(chǎng)景分析過(guò)年前的最后一篇,本章通過(guò)介紹,,,底層實(shí)現(xiàn)原理和四個(gè)集合的區(qū)別。和都是線程安全的,不同的是前者使用類(lèi),后者使用關(guān)鍵字。面試官會(huì)認(rèn)為你是一個(gè)基礎(chǔ)扎實(shí),內(nèi)功深厚的人才到這里常用集合使用場(chǎng)景分析就結(jié)束了。 Java 常用List集合使用場(chǎng)景分析 過(guò)年前的最后一篇,本章通過(guò)介紹ArrayList,LinkedList,Vector,CopyOnWriteArrayList...
摘要:程序正常運(yùn)行,輸出了預(yù)期容量的大小這是正常運(yùn)行結(jié)果,未發(fā)生多線程安全問(wèn)題,但這是不確定性的,不是每次都會(huì)達(dá)到正常預(yù)期的。另外,像等都有類(lèi)似多線程安全問(wèn)題,在多線程并發(fā)環(huán)境下避免使用這種集合。 這個(gè)問(wèn)題是 Java 程序員面試經(jīng)常會(huì)遇到的吧。 工作一兩年的應(yīng)該都知道 ArrayList 是線程不安全的,要使用線程安全的就使用 Vector,這也是各種 Java 面試寶典里面所提及的,可能...
摘要:同步容器及其注意事項(xiàng)中的容器主要可以分為四個(gè)大類(lèi),分別是和,但并不是所有的容器都是線程安全的。并發(fā)容器及其注意事項(xiàng)在版本之前所謂的線程安全的容器,主要指的就是同步容器,當(dāng)然因?yàn)樗蟹椒ǘ加脕?lái)保證互斥,串行度太高了,性能太差了。 Java 并發(fā)包有很大一部分內(nèi)容都是關(guān)于并發(fā)容器的,因此學(xué)習(xí)和搞懂這部分的內(nèi)容很有必要。 Java 1.5 之前提供的同步容器雖然也能保證線程安全,但是性能很差...
摘要:集合類(lèi)主要負(fù)責(zé)保存盛裝其他數(shù)據(jù),因此集合類(lèi)也被稱為容器類(lèi)。所有的集合類(lèi)都位于包下。表示一組對(duì)象,這些對(duì)象也稱為的元素。成員方法把集合轉(zhuǎn)成數(shù)組迭代器,集合的專用遍歷方式之接口概述有序的,也稱為序列。 前言 在編程中,常常需要集中存放多個(gè)數(shù)據(jù)。從傳統(tǒng)意義上講,數(shù)組是我們的一個(gè)很好的選擇,前提是我們實(shí)現(xiàn)已經(jīng)明確知道我們將要保存的對(duì)象的數(shù)量。 一旦在數(shù)組初始化時(shí)指定了數(shù)組長(zhǎng)度,這個(gè)數(shù)組長(zhǎng)度就...
閱讀 3329·2021-11-08 13:12
閱讀 2773·2021-10-15 09:41
閱讀 1468·2021-10-08 10:05
閱讀 3314·2021-10-08 10:04
閱讀 2127·2021-09-29 09:34
閱讀 2502·2019-08-30 15:55
閱讀 2992·2019-08-30 15:45
閱讀 2605·2019-08-29 14:17