java保證原子性 求各位大神,Java多線(xiàn)程看哪本書(shū)好?
求各位大神,Java多線(xiàn)程看哪本書(shū)好?推薦Java并發(fā)編程練習(xí)本書(shū)。本書(shū)從并發(fā)和線(xiàn)程安全的基本概念出發(fā),介紹如何使用類(lèi)庫(kù)提供的基本并發(fā)構(gòu)建塊來(lái)避免并發(fā)風(fēng)險(xiǎn)、構(gòu)造線(xiàn)程安全類(lèi)和驗(yàn)證線(xiàn)程安全規(guī)則。如何將較小
求各位大神,Java多線(xiàn)程看哪本書(shū)好?
推薦Java并發(fā)編程練習(xí)本書(shū)。
本書(shū)從并發(fā)和線(xiàn)程安全的基本概念出發(fā),介紹如何使用類(lèi)庫(kù)提供的基本并發(fā)構(gòu)建塊來(lái)避免并發(fā)風(fēng)險(xiǎn)、構(gòu)造線(xiàn)程安全類(lèi)和驗(yàn)證線(xiàn)程安全規(guī)則。
如何將較小的線(xiàn)程安全類(lèi)組合成較大的線(xiàn)程安全類(lèi),如何使用線(xiàn)程提高并發(fā)應(yīng)用程序的吞吐量,如何識(shí)別可并行執(zhí)行的任務(wù),如何提高單行程序子系統(tǒng)的響應(yīng)能力,如何確保并發(fā)程序執(zhí)行預(yù)期的任務(wù),以及如何提高并發(fā)代碼的性能和可擴(kuò)展性。
最后,介紹了一些高級(jí)主題,如顯式鎖定、原子變量、非阻塞算法以及如何開(kāi)發(fā)自定義同步工具類(lèi)。
總之,本書(shū)介紹完整,原理分析透徹。我希望我的回答能幫助你。
多個(gè)線(xiàn)程可以讀一個(gè)變量,只有一個(gè)線(xiàn)程可以對(duì)這個(gè)變量進(jìn)行寫(xiě),到底要不要加鎖?
下面簡(jiǎn)要說(shuō)明以下原因:
鎖定是因?yàn)椴僮鞑皇窃拥?。讓我們用操作一?lái)解釋它??聪旅鎯蓚€(gè)圖。
我這個(gè)操作需要
看上面的第二個(gè)圖,你能很清楚地理解這個(gè)過(guò)程嗎?
鎖定是為了確保上述三個(gè)步驟是原子操作。
回到問(wèn)題上來(lái),只有一個(gè)線(xiàn)程要寫(xiě),沒(méi)有競(jìng)爭(zhēng),所以不需要鎖定。
但是,如果你看第一張圖片,因?yàn)橹鲀?nèi)存和本地內(nèi)存的存在
在一個(gè)線(xiàn)程寫(xiě)入后,其他線(xiàn)程無(wú)法立即看到它。這就是可見(jiàn)性問(wèn)題。
添加volatile關(guān)鍵字后,它將在操作后強(qiáng)制工作內(nèi)存和主內(nèi)存同步,以確保其他線(xiàn)程可以立即看到它。
計(jì)算機(jī)鎖的原理?
所謂的鎖,本質(zhì)上只是內(nèi)存中的一個(gè)整數(shù)。不同的值表示不同的狀態(tài),例如1表示空閑狀態(tài)和鎖定狀態(tài)。鎖定時(shí),判斷鎖是否空閑。如果空閑,則將其修改為lock state并返回success。如果已鎖定,則返回失敗。解鎖時(shí),將鎖定狀態(tài)修改為空閑狀態(tài)。
鎖定和解鎖看起來(lái)非常簡(jiǎn)單,但操作系統(tǒng)如何保證鎖定操作本身的原子性?在多核環(huán)境中,兩個(gè)核上的代碼同時(shí)申請(qǐng)一個(gè)鎖。兩個(gè)內(nèi)核同時(shí)讀取鎖變量,判斷鎖空閑,然后將鎖變量修改為鎖狀態(tài)。兩者都返回成功。兩個(gè)內(nèi)核是否可以同時(shí)獲得鎖?當(dāng)然,這是不可能的,那么操作系統(tǒng)使用什么方法來(lái)確保鎖操作本身的原子性呢?我們可以將鎖的過(guò)程具體表示為:
讀取內(nèi)存中表示鎖的變量
判斷鎖的狀態(tài)
如果鎖已經(jīng)被添加,則返回failure
將鎖設(shè)置為lock狀態(tài),
返回success
以上每一步都對(duì)應(yīng)一條匯編語(yǔ)句,可以認(rèn)為是原子的。什么會(huì)導(dǎo)致兩個(gè)線(xiàn)程同時(shí)獲取鎖?
中斷:當(dāng)線(xiàn)程a完成第一步時(shí),會(huì)發(fā)生中斷。操作系統(tǒng)調(diào)度線(xiàn)程B,線(xiàn)程B成功鎖定它。此時(shí),發(fā)生中斷。操作系統(tǒng)安排線(xiàn)程執(zhí)行,并且從第二步開(kāi)始鎖定也成功。
多核:參見(jiàn)上面的示例。
那怎么解決呢?我們能讓硬件做一種鎖原子操作嗎?這就是著名的“測(cè)試和設(shè)置”指令所做的,它將讀取內(nèi)存、判斷和設(shè)置值作為一個(gè)原子操作。在單核環(huán)境下,鎖的操作必須是原子的。多核呢?似乎不行,因?yàn)槎嗪说逆i操作沒(méi)有干擾。它們可以同時(shí)執(zhí)行“test and set”,或者兩個(gè)線(xiàn)程可以同時(shí)獲取鎖。因此,硬件提供了一種鎖定內(nèi)存總線(xiàn)的機(jī)制,并在鎖定內(nèi)存總線(xiàn)的狀態(tài)下執(zhí)行“測(cè)試和設(shè)置”操作,“設(shè)置”操作可以確保只有一個(gè)內(nèi)核可以成功執(zhí)行,從而確保不會(huì)有多線(xiàn)程訪(fǎng)問(wèn)鎖。