成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

ArrayList 線程安全性學(xué)習(xí)

genedna / 3108人閱讀

摘要:線程安全嗎雖然天天用,但是真的沒考慮過這個問題。其實,線程不安全。沒有對多線程問題進行處理,舉個方法的例子就能證明它線程不安全。線程不安全的要比線程安全的執(zhí)行效率高。

引言

最近學(xué)校的氛圍比較活躍,考研的復(fù)習(xí),不考研的都在寫簡歷準備面試。

看了看,最近也沒有好公司來辦宣講會,也就沒了投簡歷的意向。最近看了看面試題,想著補一補基礎(chǔ),以后面幾家Spring Cloud的企業(yè),去和面試官交流交流。

Spring Cloud的學(xué)習(xí)與體會

最近看了《Spring Cloud微服務(wù)實戰(zhàn)》一書,感覺受益匪淺,大有裨益。

高并發(fā)應(yīng)用,必須是要啟用Spring Cloud的。有了Spring Cloud,就不用再像之前一樣,前端工程師團隊,后端工程師團隊,運維團隊。而是按模塊劃分,訂單模塊團隊,支付模塊團隊,每個團隊里都是從前端到后臺到運維的全棧工程師。

就像上次黃庭祥說的,ThinkPHP開發(fā),他寫學(xué)期管理;AngularJS開發(fā),他又寫學(xué)期管理;Angular開發(fā),他還寫學(xué)期管理。想到什么了么?肯定精通這個模塊的業(yè)務(wù)邏輯???

如果培養(yǎng)出優(yōu)秀的支付模塊團隊、優(yōu)秀的安全模塊團隊、優(yōu)秀的高并發(fā)優(yōu)化團隊,其實淘寶也不過如此。

相互的依賴,從原來的@Autowired轉(zhuǎn)為服務(wù)器接口間的調(diào)用。每個模塊都是一個Spring Cloud應(yīng)用,各應(yīng)用間通過互相調(diào)用、相互協(xié)作共同實現(xiàn)業(yè)務(wù)功能,同時,各應(yīng)用模塊可以采用不同的數(shù)據(jù)庫,以發(fā)揮各數(shù)據(jù)庫之所長。

然后后臺分布式部署,到了并發(fā)的時候,給相應(yīng)的模塊加服務(wù)器負載均衡就是了。個人中心模塊,不常用,兩個服務(wù)器負載;訂單模塊,可能會并發(fā),加個百十來個服務(wù)器負載均衡。當然,像618、雙十一這樣的場景,肯定不是加服務(wù)器就能解決的,我這里只是舉個簡單的例子。模塊劃分之后,可以有針對性地解決高并發(fā)問題。

不扯淡了,開始進入正題。

面試題 再談線程安全

什么是線程安全?

我看到這道題就感覺怎么也說不出來,就是多線程的環(huán)境下運行,我這個應(yīng)用也不炸,雖然是這個意思,但是也不能這樣回答啊?一時之間,找不到相關(guān)的學(xué)術(shù)詞匯回答此問題。

這是想了許久后,我自己總結(jié)出的回答:

程序在單線程環(huán)境下正常執(zhí)行得到了正確的結(jié)果,在多個線程并發(fā)執(zhí)行的環(huán)境條件下,仍然能得到像單線程一樣正確的結(jié)果,這就是線程安全。

如果一個類(或?qū)ο?,我們在使用時,無需考慮任何多線程相關(guān)的問題,就像單線程一樣使用,且最后能得到正確的結(jié)果,那就說這個類(或?qū)ο?是線程安全的。

ArrayList線程安全嗎?

看了許多面試題,發(fā)現(xiàn)面試官都喜歡以一個小方面進行切入,然后無限擴展,直到把面試者問懵圈為止。

ArrayList線程安全嗎?

雖然天天用ArrayList,但是真的沒考慮過這個問題。其實,ArrayList線程不安全。

ArrayList是一個內(nèi)部采用數(shù)組實現(xiàn)的線性表,它相比數(shù)組最大的優(yōu)點就是使用時可以不用去像數(shù)組一樣new的時候去考慮要容納多少個元素。ArrayList默認構(gòu)造一個容量為10的數(shù)組。

private static final int DEFAULT_CAPACITY = 10;

如果容量不夠了,ArrayList會自動擴容,擴容至原來的1.5倍。(右移一位,相當于除以2)。

int newCapacity = oldCapacity + (oldCapacity >> 1);

ArrayList沒有對多線程問題進行處理,舉個add方法的例子就能證明它線程不安全。

elementData[size++] = e;

別看這是一行,其實是執(zhí)行了兩步操作,賦值和自增。

線程A add一個元素,然后暫停執(zhí)行,size還沒自增,然后線程Badd元素,size沒變,就直接把A add的元素覆蓋了。

不安全為什么要使用?

又回到了之前向晨澍請教的問題,線程安全,必然是有額外開銷的。

所以List的三個接口ArrayList、LinkedListVector。

線程不安全的要比線程安全的執(zhí)行效率高。所以我們常用的是線程不安全的ArrayList、LinkedList,而從來沒有用過線程安全的Vector。

VectorJDK1.0就存在,設(shè)計得不夠完善,多線程情況下如果使用不當也會發(fā)生錯誤,不推薦使用。

如何解決線程不安全

既然Vector不能用,那我就想要一個線程安全的List得怎么整呢?

調(diào)用Collections.synchronizedList方法,使ArrayList線程安全。

List synchronizedList = Collections.synchronizedList(new ArrayList<>());

返回SynchronizedList類的對象,經(jīng)典的裝飾器模式,對方法訪問加了同步。

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àn)未休。天下英雄誰敵手?曹劉。生子當如孫仲謀。

——辛棄疾 《南鄉(xiāng)子·登京口北固亭有懷》

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/74497.html

相關(guān)文章

  • Java 常用List集合使用場景分析

    摘要:常用集合使用場景分析過年前的最后一篇,本章通過介紹,,,底層實現(xiàn)原理和四個集合的區(qū)別。和都是線程安全的,不同的是前者使用類,后者使用關(guān)鍵字。面試官會認為你是一個基礎(chǔ)扎實,內(nèi)功深厚的人才到這里常用集合使用場景分析就結(jié)束了。 Java 常用List集合使用場景分析 過年前的最后一篇,本章通過介紹ArrayList,LinkedList,Vector,CopyOnWriteArrayList...

    godruoyi 評論0 收藏0
  • 出場率比較高的一道多線程安全面試題

    摘要:程序正常運行,輸出了預(yù)期容量的大小這是正常運行結(jié)果,未發(fā)生多線程安全問題,但這是不確定性的,不是每次都會達到正常預(yù)期的。另外,像等都有類似多線程安全問題,在多線程并發(fā)環(huán)境下避免使用這種集合。 這個問題是 Java 程序員面試經(jīng)常會遇到的吧。 工作一兩年的應(yīng)該都知道 ArrayList 是線程不安全的,要使用線程安全的就使用 Vector,這也是各種 Java 面試寶典里面所提及的,可能...

    xiyang 評論0 收藏0
  • [Java并發(fā)-11] 并發(fā)容器的使用

    摘要:同步容器及其注意事項中的容器主要可以分為四個大類,分別是和,但并不是所有的容器都是線程安全的。并發(fā)容器及其注意事項在版本之前所謂的線程安全的容器,主要指的就是同步容器,當然因為所有方法都用來保證互斥,串行度太高了,性能太差了。 Java 并發(fā)包有很大一部分內(nèi)容都是關(guān)于并發(fā)容器的,因此學(xué)習(xí)和搞懂這部分的內(nèi)容很有必要。 Java 1.5 之前提供的同步容器雖然也能保證線程安全,但是性能很差...

    legendaryedu 評論0 收藏0
  • java學(xué)習(xí)(七) —— API集合類

    摘要:集合類主要負責(zé)保存盛裝其他數(shù)據(jù),因此集合類也被稱為容器類。所有的集合類都位于包下。表示一組對象,這些對象也稱為的元素。成員方法把集合轉(zhuǎn)成數(shù)組迭代器,集合的專用遍歷方式之接口概述有序的,也稱為序列。 前言 在編程中,常常需要集中存放多個數(shù)據(jù)。從傳統(tǒng)意義上講,數(shù)組是我們的一個很好的選擇,前提是我們實現(xiàn)已經(jīng)明確知道我們將要保存的對象的數(shù)量。 一旦在數(shù)組初始化時指定了數(shù)組長度,這個數(shù)組長度就...

    senntyou 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<