最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

過關(guān)斬將之路-Synchronized&CAS(IT楓斗者)

2023-04-28 10:06 作者:IT楓斗者-跳蚤網(wǎng)  | 我要投稿

Synchronized

1問:什么時候需要synchronized?

1答synchronized是一把可重入的排他鎖。鎖有個專門的名字:對象監(jiān)視器(Object Monitor)在多個線程操作共享數(shù)據(jù)的時候,保證對共享數(shù)據(jù)訪問的線程安全性。在JDK1.6之前,它是一個重量級鎖的角色,但是在JDK1.6之后對synchronized做了優(yōu)化,有了鎖升級的過程。偏向鎖->輕量級鎖->OS重量級鎖。。(IT楓斗者怎么樣)


2問:使用Synchronized關(guān)鍵字需要注意什么?

2答

  • Synchronized使用時需要注意的地方鎖對象不能為空。

    鎖對象的信息是保留在對象頭中的,如果對象為空,則鎖的信息也就不存在了。

  • 作用域不宜過大

    synchronized代碼塊的代碼量不宜過多,如果把過多的代碼放在其中,程序的運行會變?yōu)榇校俣葧陆?。各個線程并行可以提高效率,我們應(yīng)該僅把那些影響線程安全的代碼,放入synchronized代碼塊中,串行執(zhí)行;不需要考慮線程安全的代碼,并行執(zhí)行,達(dá)到效率最高。

  • 避免死鎖

    避免讓線程對鎖持有并等待的情況出現(xiàn)

3問:synchronized能用在哪些地方?

3答

  • 當(dāng)synchronized作用在實例方法時,監(jiān)視器鎖(monitor)便是對象實例(this);

  • 當(dāng)synchronized作用在靜態(tài)方法時,監(jiān)視器鎖(monitor)便是對象的Class實例,因為Class數(shù)據(jù)存在于永久代,因此靜態(tài)方法鎖相當(dāng)于該類的一個全局鎖;

  • 當(dāng)synchronized作用在某一個對象實例時,監(jiān)視器鎖(monitor)便是括號括起來的對象實例;(IT楓斗者怎么樣)

4問:Sychornized是否是公平鎖?

4答:不是公平鎖


5問:聊聊synchronized加鎖流程

5答由于HotSpot的作者經(jīng)過研究發(fā)現(xiàn),大多數(shù)情況下,鎖不僅不存在多線程競爭,而且總是由同一線程多次獲得,為了讓線程獲得鎖的代價更低從而引入偏向鎖。偏向鎖在獲取資源的時候會在鎖對象頭上記錄當(dāng)前線程ID,偏向鎖并不會主動釋放,這樣每次偏向鎖進(jìn)入的時候都會判斷鎖對象頭中線程ID是否為自己,如果是當(dāng)前線程重入,直接進(jìn)入同步操作,不需要額外的操作。默認(rèn)在開啟偏向鎖和輕量鎖的情況下,當(dāng)線程進(jìn)來時,首先會加上偏向鎖,其實這里只是用一個狀態(tài)來控制,會記錄加鎖的線程,如果是線程重入,則不會進(jìn)行鎖升級。獲取偏向鎖流程:

輕量級鎖是相對于重量級鎖需要阻塞/喚醒涉及上下文切換而言,主要針對多個線程在不同時間請求同一把鎖的場景。輕量級鎖獲取過程:

當(dāng)有多個鎖競爭輕量級鎖則會升級為重量級鎖,重量級鎖正常會進(jìn)入一個cxq的隊列,在調(diào)用wait方法之后,則會進(jìn)入一個waitSet的隊列park等待,而當(dāng)調(diào)用notify方法喚醒之后,則有可能進(jìn)入EntryList。重量級鎖加鎖過程:

(IT楓斗者怎么樣)


6問:鎖得升級過程你了解嗎?
6答:以下是32位對象頭描述

(IT楓斗者怎么樣)

synchronized鎖的膨脹過程:當(dāng)線程訪問同步代碼塊。首先查看當(dāng)前鎖狀態(tài)是否是偏向鎖(可偏向狀態(tài))(IT楓斗者怎么樣)

  • 如果是偏向鎖:

1、檢查當(dāng)前mark word中記錄是否是當(dāng)前線程id,如果是當(dāng)前線程id,則獲得偏向鎖執(zhí)行同步代碼塊。2、如果不是當(dāng)前線程id,cas操作替換線程id,替換成功獲得偏向鎖(線程復(fù)用),替換失敗鎖撤銷升級輕(同一類對象多次撤銷升級達(dá)到閾值20,則批量重偏向,這個點可以稍微提一下,詳見下面的注意)(IT楓斗者怎么樣)

  • 升級輕量鎖

升級輕量鎖對于當(dāng)前線程,分配棧幀鎖記錄lock_record(包含mark word和object-指向鎖記錄首地址),對象頭mark word復(fù)制到線程棧幀的鎖記錄?mark word存儲的是無鎖的hashcode(里面有重入次數(shù)問題)

  • 重量級鎖(純理論可結(jié)合源碼)

CAS自旋達(dá)到一定次數(shù)升級為重量級鎖(多個線程同時競爭鎖時)存儲在ObjectMonitor對象,里面有很多性?ContentionListEntryList?、WaitSet、?owner?。當(dāng)一個線程嘗試獲取鎖時,如果該鎖已經(jīng)被占用,則該線程封裝成ObjectWaiter對象插到ContentionList隊列的對首,然后調(diào)用park掛起。該線程鎖時方式會從ContentionListEntryList挑 一個喚醒。線程獲得鎖后調(diào)用Objectwait方法,則會加入WaitSet集合中(當(dāng)前鎖或膨脹為重量級鎖)(IT楓斗者怎么樣)

注意:

CAS

7問:CAS流程是怎樣的?

7答:CAS機(jī)制中使用了3個基本操作數(shù):內(nèi)存地址V,舊的預(yù)期值A(chǔ),要修改的新值B。當(dāng)且僅當(dāng)舊的預(yù)期值A(chǔ)和內(nèi)存地址V對應(yīng)的值相同時,才將內(nèi)存值修改為B,否則什么都不做,最后返回現(xiàn)在的V值。簡單理解為這句話:我認(rèn)為V的值應(yīng)該是A,如果是A的話我就把他改成B,如果不是A的話(那就證明被別人修改過了),那我就不修改了,避免多人同時修改導(dǎo)致數(shù)據(jù)出錯。換句話說:要想修改成功,必須保證A和V中的值是一樣的,修改前有個對比的過程。(IT楓斗者怎么樣)


8問CAS有哪些缺點?

8答

  • 高并發(fā)情況下CPU開銷大。因為每次對比發(fā)現(xiàn)被改了后就會獲取新值,重復(fù)進(jìn)行此過程。

  • ABA問題??梢圆扇tomic包下的 AtomicStampedReference<E> ,它通過包裝[E,Integer]的元組來對對象標(biāo)記版本戳stamp,從而避免ABA問題。

  • 不能保證代碼塊的原子性,只能保證單個變量的原子性。

9問CAS的ABA問題了解嗎?(可舉例說明)(IT楓斗者怎么樣)

9答

10問CAS能保證原子性嗎?

10答CAS只能保證單個變量的原子性,不能保證代碼塊或者多個變量共同進(jìn)行原子性的更新。這時候就需要鎖的支持了,比如synchronized、Lock接口。


11問CAS和Synchronized啥區(qū)別?

11答

  • 從思想上來講,Synchronized屬于悲觀鎖,悲觀的認(rèn)為程序中的并發(fā)情況嚴(yán)重,所以嚴(yán)防死守,高并發(fā)情況下效率低下。而CAS屬于樂觀鎖,樂觀的認(rèn)為程序中的并發(fā)情況不那么嚴(yán)重,所以讓線程不斷去重試更新。但實際上Synchronized已經(jīng)改造了,帶有鎖升級的功能。效率不亞于cas。

  • CAS是個思想,具體實現(xiàn)在atomic下有很多工具類。而synchronized是個關(guān)鍵字,可以直接拿來用。

  • CAS只能保證單個變量更新的原子性,synchronized能保證一段代碼塊的原子性。(IT楓斗者怎么樣)


過關(guān)斬將之路-Synchronized&CAS(IT楓斗者)的評論 (共 條)

分享到微博請遵守國家法律
荥阳市| 梁河县| 枞阳县| 宣武区| 绥中县| 威海市| 永州市| 中卫市| 南丰县| 淮滨县| 托里县| 伊春市| 上犹县| 农安县| 金川县| 若羌县| 修水县| 密云县| 石阡县| 连南| 河东区| 潮安县| 中山市| 扶风县| 榆中县| 揭西县| 衡阳县| 外汇| 财经| 新乐市| 玉树县| 临高县| 屯留县| 扶绥县| 闸北区| 阳新县| 土默特右旗| 十堰市| 商南县| 太湖县| 双辽市|