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

資訊專(zhuān)欄INFORMATION COLUMN

學(xué)習(xí)Java多線程的一些總結(jié)

coolpail / 3039人閱讀

摘要:多線程環(huán)境下的一些問(wèn)題安全性問(wèn)題在沒(méi)有正確同步的情況下,多線程環(huán)境下程序可能得出錯(cuò)誤的結(jié)果。一些相關(guān)概念競(jìng)爭(zhēng)條件多線程的環(huán)境下,程序執(zhí)行的結(jié)果取決于線程交替執(zhí)行的方式。而線程的交替操作順序是不可預(yù)測(cè)的,如此程序執(zhí)行的結(jié)果也是不可預(yù)測(cè)的。

入口
Java多線程的應(yīng)用復(fù)雜性之如jvm有限的幾個(gè)內(nèi)存方面的操作和規(guī)范,就像無(wú)數(shù)紛繁復(fù)雜的應(yīng)用邏輯建立在有限的指令集上。

如何寫(xiě)出線程安全的程序,有各種各樣需要遵循的規(guī)則,如果硬是去記憶這些寫(xiě)法或者規(guī)則,就事倍功半了,最好是先學(xué)習(xí)原理,抓住問(wèn)題的主干,再拓展細(xì)節(jié),這也是大家公認(rèn)的學(xué)習(xí)某種技術(shù)的方式。對(duì)于多線程的問(wèn)題,java使用java內(nèi)存模型 JMM來(lái)保證多個(gè)線程可以有效地,正確地工作。

學(xué)習(xí)的步驟可以分為:

關(guān)注大師的言行,跟隨大師的舉動(dòng)——JUC包已經(jīng)足夠豐富,按照API規(guī)范正確使用。

和大師一起修行——理解多線程問(wèn)題的由來(lái),以及jvm給出的解決方案,需要理解java的內(nèi)存模型JMM,以及JMM給出的線程工作內(nèi)存與主內(nèi)存交互的規(guī)則如何形成JMM的happens-before原則等。參考書(shū)有知名的《深入理解Java虛擬機(jī)》第12章,最重要的《JSR-133 Java內(nèi)存模型與線程規(guī)范》以及《并發(fā)編程實(shí)戰(zhàn)》第16章。

領(lǐng)悟大師的意境——JUC包的實(shí)現(xiàn)原理,volatile和CAS構(gòu)筑了JUC包的基礎(chǔ)類(lèi),AQS,非阻塞數(shù)據(jù)結(jié)構(gòu),原子變量,這些基礎(chǔ)類(lèi)又構(gòu)建了JUC包的高層類(lèi),Lock,同步器,阻塞隊(duì)列,并發(fā)容器,Executor等。理解了高層類(lèi)的原理,能夠心里有底地使用這些類(lèi),構(gòu)建健壯的應(yīng)用。

成為真正的大師——學(xué)習(xí)JUC包的實(shí)現(xiàn),說(shuō)不定哪天也能寫(xiě)出一樣優(yōu)秀的類(lèi)。

一些背景知識(shí):
1.操作系統(tǒng)中線程的實(shí)現(xiàn)

現(xiàn)代操作系統(tǒng)的線程主要有三種實(shí)現(xiàn):內(nèi)核線程實(shí)現(xiàn),用戶線程實(shí)現(xiàn),混合實(shí)現(xiàn)

內(nèi)核線程(KLT):線程表由內(nèi)核維護(hù),由內(nèi)核完成線程的切換,內(nèi)核通過(guò)調(diào)度器對(duì)線程進(jìn)行調(diào)度,并將線程的任務(wù)映射到處理器上,每個(gè)內(nèi)核線程可以視為內(nèi)核的一個(gè)分身。程序一般不會(huì)直接使用內(nèi)核線程,而是使用內(nèi)核線程的一種高級(jí)接口——輕量級(jí)進(jìn)程(LWP)(廣義上來(lái)說(shuō),輕量級(jí)進(jìn)程也是在用戶空間的進(jìn)程中的,所以也是一種用戶線程)。LWP和KLT是一一對(duì)應(yīng)的,是1:1的關(guān)系,因此也叫作一對(duì)一線程模型(1:1)。內(nèi)核線程最大的特點(diǎn)就是,如果有輕量級(jí)進(jìn)程發(fā)生了阻塞,不會(huì)影響整個(gè)進(jìn)程的工作,內(nèi)核會(huì)運(yùn)行其他可運(yùn)行的線程。缺點(diǎn)也是明顯的:各種線程操作都需要系統(tǒng)調(diào)用,需要在用戶態(tài)和內(nèi)核態(tài)進(jìn)行來(lái)回切換,代價(jià)高昂,而且因?yàn)檎加脙?nèi)核空間,所以內(nèi)核能支持的數(shù)量是有限的。

用戶級(jí)線程(UT):狹義上的用戶線程是指,完全建立在用戶空間的線程庫(kù)上,由所在進(jìn)程實(shí)現(xiàn)管理的線程。最大的亮點(diǎn)在于可以在不支持多線程的操作系統(tǒng)之上實(shí)現(xiàn)多線程,如DOS,同時(shí)因?yàn)椴恍枰袚Q到內(nèi)核態(tài),所以快速且低消耗,也能支持更大規(guī)模的線程數(shù)量。這種模型中,一個(gè)輕量級(jí)進(jìn)程對(duì)應(yīng)多個(gè)線程,因此叫做一對(duì)多線程模型(1:N),用戶進(jìn)程的優(yōu)勢(shì)在于不需要內(nèi)核的支援,而因?yàn)闆](méi)有內(nèi)核的支援,所有的線程操作都需要用戶自己處理,導(dǎo)致復(fù)雜性是其劣勢(shì)。線程的創(chuàng)建,切換,調(diào)度都是需要考慮的問(wèn)題,現(xiàn)在使用用戶線程的程序已經(jīng)越來(lái)越少了。java線程在JDK1.2之前,使用用戶線程。

用戶線程+輕量級(jí)進(jìn)程的混合實(shí)現(xiàn):使用輕量級(jí)進(jìn)程作為用戶線程和內(nèi)核線程的橋梁的一種實(shí)現(xiàn),用戶線程和輕量級(jí)進(jìn)程的比例不定,因此也叫多對(duì)多線程模型(N:M),UNIX家族中的Solaris提供了N:M的線程模型實(shí)現(xiàn)。

更詳細(xì)的說(shuō)明可以查看介紹操作系統(tǒng)的書(shū)籍。

2.java虛擬機(jī)中線程的實(shí)現(xiàn)

jdk1.2 之前,java使用的是稱為“綠色線程”的用戶線程,而在1.2中,線程模型替換為基于操作系統(tǒng)原生線程模型來(lái)實(shí)現(xiàn)

操作系統(tǒng)支持什么樣的線程模型,很大程度上影響java的線程模型,windows和linux系統(tǒng)提供的線程模型是1:1的,所有這兩個(gè)平臺(tái)上的JDK使用的是1:1的線程模型,一個(gè)java線程映射到一個(gè)輕量級(jí)進(jìn)程中,Solaris系統(tǒng)同時(shí)支持1:1和N:M,該平臺(tái)中的JDK可以指定參數(shù)選擇線程模型。

操作系統(tǒng)的線程特性會(huì)對(duì)線程的并發(fā)規(guī)模和操作成本產(chǎn)生影響,但是對(duì)java程序的編寫(xiě)和運(yùn)行來(lái)說(shuō)是透明的。

3.多線程環(huán)境下的一些問(wèn)題:

安全性問(wèn)題:在沒(méi)有正確同步的情況下,多線程環(huán)境下程序可能得出錯(cuò)誤的結(jié)果。

活躍性問(wèn)題:在多線程環(huán)境下,當(dāng)某個(gè)操作應(yīng)該繼續(xù)執(zhí)行卻無(wú)法繼續(xù)執(zhí)行下去,就造成了活躍性問(wèn)題,如:死鎖,饑餓,活鎖。

死鎖:

活鎖:

饑餓:

性能問(wèn)題:線程的頻繁切換將帶來(lái)極大的開(kāi)銷(xiāo),如:

保存和恢復(fù)執(zhí)行上下文,丟失局部性

使用同步機(jī)制的時(shí)候,這些機(jī)制會(huì)抑制某些編譯器優(yōu)化以保證執(zhí)行順序,

如使用volatile保證可見(jiàn)性的情況下,使內(nèi)存緩沖區(qū)中的數(shù)據(jù)無(wú)效,其他線程需要重新從主內(nèi)存中加載

所有這些因素會(huì)帶來(lái)額外的性能開(kāi)銷(xiāo)。

4.一些相關(guān)概念

競(jìng)爭(zhēng)條件:多線程的環(huán)境下,程序執(zhí)行的結(jié)果取決于線程交替執(zhí)行的方式。而線程的交替操作順序是不可預(yù)測(cè)的,如此程序執(zhí)行的結(jié)果也是不可預(yù)測(cè)的。

狀態(tài):狀態(tài)在多線程編程中是一個(gè)很核心的概念,因?yàn)榫€程安全性的核心就在于:對(duì)可變的共享狀態(tài)的訪問(wèn)操作進(jìn)行正確的管理。

非正式的定義:狀態(tài)可以簡(jiǎn)單理解為存儲(chǔ)在對(duì)象的域中的數(shù)據(jù),下面的Counter類(lèi)中的count就是一個(gè)Counter對(duì)象的狀態(tài)。如果不能正確地訪問(wèn)和修改count,那么count的值就不具備正確性。狀態(tài)也包括一個(gè)對(duì)象依賴的對(duì)象的域。

多線程的環(huán)境下,主要是可變的,共享的狀態(tài)會(huì)導(dǎo)致安全性問(wèn)題,可變意味著狀態(tài)可以被修改,共享意味著可以被多個(gè)線程改變,自然而然的,有三種方法來(lái)解決這個(gè)問(wèn)題:1.讓對(duì)象不可改變 2. 讓狀態(tài)不可共享 3. 必須共享和改變的,使用某種機(jī)制來(lái)保證順序——同步。

或者更加直接可靠的,不要給對(duì)象狀態(tài),一個(gè)沒(méi)有狀態(tài)的對(duì)象一定是線程安全的。

線程安全性:當(dāng)多個(gè)線程訪問(wèn)某個(gè)類(lèi)的時(shí)候,這個(gè)類(lèi)始終能表現(xiàn)正確的行為,那么這個(gè)類(lèi)是線程安全的。

        public class Counter {
            private long count = 0;
            public long getCount(){
                return count;
            }
        }

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

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

相關(guān)文章

  • Java開(kāi)發(fā)

    摘要:大多數(shù)待遇豐厚的開(kāi)發(fā)職位都要求開(kāi)發(fā)者精通多線程技術(shù)并且有豐富的程序開(kāi)發(fā)調(diào)試優(yōu)化經(jīng)驗(yàn),所以線程相關(guān)的問(wèn)題在面試中經(jīng)常會(huì)被提到。將對(duì)象編碼為字節(jié)流稱之為序列化,反之將字節(jié)流重建成對(duì)象稱之為反序列化。 JVM 內(nèi)存溢出實(shí)例 - 實(shí)戰(zhàn) JVM(二) 介紹 JVM 內(nèi)存溢出產(chǎn)生情況分析 Java - 注解詳解 詳細(xì)介紹 Java 注解的使用,有利于學(xué)習(xí)編譯時(shí)注解 Java 程序員快速上手 Kot...

    LuDongWei 評(píng)論0 收藏0
  • 初學(xué)者福音!可能是最適合你Java學(xué)習(xí)路線和方法推薦。

    摘要:學(xué)習(xí)完多線程之后可以通過(guò)下面這些問(wèn)題檢測(cè)自己是否掌握,下面這些問(wèn)題的答案以及常見(jiàn)多線程知識(shí)點(diǎn)的總結(jié)在這里??蛇x數(shù)據(jù)結(jié)構(gòu)與算法如果你想進(jìn)入大廠的話,我推薦你在學(xué)習(xí)完基礎(chǔ)或者多線程之后,就開(kāi)始每天抽出一點(diǎn)時(shí)間來(lái)學(xué)習(xí)算法和數(shù)據(jù)結(jié)構(gòu)。 我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識(shí)點(diǎn)以及面試問(wèn)題,已經(jīng)開(kāi)源,目前已經(jīng) 35k+ Star。會(huì)一直完善下去,歡迎建議和指導(dǎo),同時(shí)也歡迎Star: https://...

    yanest 評(píng)論0 收藏0
  • java

    摘要:多線程編程這篇文章分析了多線程的優(yōu)缺點(diǎn),如何創(chuàng)建多線程,分享了線程安全和線程通信線程池等等一些知識(shí)。 中間件技術(shù)入門(mén)教程 中間件技術(shù)入門(mén)教程,本博客介紹了 ESB、MQ、JMS 的一些知識(shí)... SpringBoot 多數(shù)據(jù)源 SpringBoot 使用主從數(shù)據(jù)源 簡(jiǎn)易的后臺(tái)管理權(quán)限設(shè)計(jì) 從零開(kāi)始搭建自己權(quán)限管理框架 Docker 多步構(gòu)建更小的 Java 鏡像 Docker Jav...

    honhon 評(píng)論0 收藏0
  • 超詳細(xì)Java面試題總結(jié)(二)之Java基礎(chǔ)知識(shí)篇

    摘要:超詳細(xì)的面試題總結(jié)一之基本知識(shí)多線程和虛擬機(jī)創(chuàng)建線程有幾種不同的方式你喜歡哪一種為什么繼承類(lèi)實(shí)現(xiàn)接口應(yīng)用程序可以使用框架來(lái)創(chuàng)建線程池實(shí)現(xiàn)接口。死亡線程方法執(zhí)行結(jié)束,或者因異常退出了方法,則該線程結(jié)束生命周期。死亡的線程不可再次復(fù)生。 超詳細(xì)的Java面試題總結(jié)(一)之Java基本知識(shí) 多線程和Java虛擬機(jī) 創(chuàng)建線程有幾種不同的方式?你喜歡哪一種?為什么? 繼承Thread類(lèi) 實(shí)現(xiàn)R...

    wangjuntytl 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

coolpail

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<