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

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

Java并發(fā)編程大揭秘:synchronized和Lock誰(shuí)更勝一籌?

2023-04-25 17:37 作者:做架構(gòu)師不做框架師  | 我要投稿

大家好,我是小米,在日常的開(kāi)發(fā)工作中,鎖是我們常常會(huì)使用到的概念。在 Java 中,synchronized 和 lock 都是用于多線程同步的關(guān)鍵字和類。今天,我就來(lái)為大家詳細(xì)介紹一下synchronized 與 lock 的區(qū)別,包括從存在層次、鎖的獲取方式、鎖的釋放、鎖類型、性能、支持鎖的場(chǎng)景等十個(gè)區(qū)別點(diǎn),并通過(guò)兩個(gè)電商項(xiàng)目的實(shí)際案例來(lái)演示它們的區(qū)別。

synchronized 與 lock 的區(qū)別

  • 存在層次:synchronized 是 Java 語(yǔ)言內(nèi)置的關(guān)鍵字,屬于 JVM 層面的鎖;而 lock 是 Java 類庫(kù)提供的一個(gè)類,屬于 Java 語(yǔ)言層面的鎖。

  • 鎖的獲取方式:synchronized 的獲取方式是隱式的,即在進(jìn)入同步代碼塊或方法時(shí)自動(dòng)獲取鎖,并在退出時(shí)自動(dòng)釋放鎖;而 lock 的獲取方式是顯式的,需要手動(dòng)調(diào)用lock() 方法獲取鎖,并在使用完后手動(dòng)調(diào)用 unlock() 方法釋放鎖。

  • 鎖的釋放:synchronized 的鎖是在出現(xiàn)異?;蛘邎?zhí)行完同步代碼塊或方法后自動(dòng)釋放的;而 lock 需要在 finally 塊中手動(dòng)調(diào)用 unlock() 方法釋放鎖,否則可能導(dǎo)致死鎖。

  • 鎖類型:synchronized 只有一種類型的鎖,即互斥鎖,它是非公平鎖;而 lock 提供了多種類型的鎖,包括公平鎖和非公平鎖。

  • 性能:synchronized 是 JVM 內(nèi)置的鎖,效率相對(duì)較低,因?yàn)樗鼤?huì)涉及到用戶態(tài)和內(nèi)核態(tài)的切換;而 lock 是Java 類庫(kù)提供的鎖,性能較高,因?yàn)樗褂昧烁讓拥挠布?jí)別的實(shí)現(xiàn)。

  • 支持鎖的場(chǎng)景:synchronized 只支持在代碼塊和方法上加鎖;而 lock 支持更靈活的加鎖和釋放方式,例如可以在任意位置加鎖和釋放鎖,支持多個(gè)條件變量的使用。

  • 可重入性:synchronized 是可重入鎖,即同一線程可以多次獲取同一把鎖而不會(huì)死鎖;而 lock 也是可重入鎖,但需要注意要手動(dòng)調(diào)用相同次數(shù)的 unlock() 方法才能完全釋放鎖。

  • 等待通知機(jī)制:synchronized使用的是wait()和notify()/notifyAll() 方法實(shí)現(xiàn)線程之間的等待和通知機(jī)制;而 lock 使用的是 Condition 對(duì)象來(lái)實(shí)現(xiàn)類似的功能。

  • 可見(jiàn)性:synchronized 在進(jìn)入同步代碼塊時(shí)會(huì)自動(dòng)獲取鎖并刷新線程的工作內(nèi)存,保證了線程間的可見(jiàn)性;而lock 需要手動(dòng)使用 volatile 關(guān)鍵字或者顯式調(diào)用 lock() 和 unlock() 方法來(lái)保證可見(jiàn)性。

  • 鎖的粒度:synchronized 是對(duì)整個(gè)對(duì)象進(jìn)行加鎖的,即當(dāng)一個(gè)線程獲得了某個(gè)對(duì)象的鎖后,其他線程無(wú)法獲得該對(duì)象的任何鎖;而 lock 可以實(shí)現(xiàn)更細(xì)粒度的鎖定,例如可以對(duì)對(duì)象的某個(gè)屬性或者某一段代碼塊進(jìn)行加鎖,從而提高并發(fā)性能。

synchronized的加鎖流程

在 Java 中,synchronized 鎖可以分為三種類型:偏向鎖、輕量級(jí)鎖和重量級(jí)鎖。偏向鎖適用于無(wú)競(jìng)爭(zhēng)的情況,輕量級(jí)鎖適用于短時(shí)間內(nèi)競(jìng)爭(zhēng)不激烈的情況,重量級(jí)鎖適用于競(jìng)爭(zhēng)激烈或者競(jìng)爭(zhēng)時(shí)間較長(zhǎng)的情況。

  • 偏向鎖:當(dāng)一個(gè)線程訪問(wèn)同步代碼塊時(shí),會(huì)先檢查對(duì)象頭中的 Mark Word,如果發(fā)現(xiàn)沒(méi)有被其他線程鎖定,就會(huì)將當(dāng)前線程 ID 記錄到 Mark Word 中,并將 Mark Word 設(shè)置為偏向鎖。以后該線程再次訪問(wèn)同步代碼塊時(shí),無(wú)需重新獲取鎖,而是直接使用偏向鎖,從而避免了大部分的同步操作,提高了性能。

  • 輕量級(jí)鎖:當(dāng)多個(gè)線程同時(shí)訪問(wèn)同步代碼塊時(shí),會(huì)發(fā)生輕量級(jí)鎖的競(jìng)爭(zhēng)。這時(shí),JVM 會(huì)嘗試將對(duì)象頭中的 Mark Word 設(shè)置為輕量級(jí)鎖,并將當(dāng)前線程的 ID 記錄在鎖記錄(Lock Record)中。如果競(jìng)爭(zhēng)不激烈,當(dāng)前線程可以順利獲取輕量級(jí)鎖,執(zhí)行同步操作;如果競(jìng)爭(zhēng)激烈,獲取輕量級(jí)鎖失敗,會(huì)升級(jí)為重量級(jí)鎖。

  • 重量級(jí)鎖:當(dāng)輕量級(jí)鎖競(jìng)爭(zhēng)失敗或者鎖對(duì)象已經(jīng)被設(shè)置為重量級(jí)鎖時(shí),會(huì)升級(jí)為重量級(jí)鎖。重量級(jí)鎖使用操作系統(tǒng)的互斥量來(lái)實(shí)現(xiàn),會(huì)導(dǎo)致線程的阻塞和喚醒,性能較差。

需要注意的是,鎖的升級(jí)是單向的,即鎖一旦升級(jí)為重量級(jí)鎖,就無(wú)法再降級(jí)為輕量級(jí)鎖或者偏向鎖。

實(shí)際案例

下面,我通過(guò)兩個(gè)電商項(xiàng)目的實(shí)際案例來(lái)演示 synchronized 和lock 的區(qū)別。

使用synchronized:假設(shè)在電商項(xiàng)目中,存在一個(gè)訂單處理的方法,多個(gè)線程同時(shí)調(diào)用該方法進(jìn)行訂單處理。

在這個(gè)案例中,使用了synchronized 關(guān)鍵字對(duì)processOrder() 方法進(jìn)行了加鎖,保證了訂單處理的線程安全性。當(dāng)一個(gè)線程獲得了對(duì)象的鎖后,其他線程無(wú)法獲得該對(duì)象的鎖,從而保證了同一時(shí)刻只有一個(gè)線程能夠執(zhí)行訂單處理邏輯。然而,由于 synchronized 是重量級(jí)鎖,可能會(huì)導(dǎo)致性能下降,特別是在高并發(fā)的情況下。

使用Lock:

在這個(gè)案例中,使用了 Lock 接口和 ReentrantLock 類來(lái)實(shí)現(xiàn)加鎖和解鎖的操作。與 synchronized 不同的是,使用 Lock時(shí),我們需要手動(dòng)調(diào)用 lock() 方法來(lái)獲取鎖,并在 finally 塊中調(diào)用 unlock() 方法來(lái)釋放鎖。這樣可以實(shí)現(xiàn)更細(xì)粒度的鎖定,從而提高了并發(fā)性能。

END

綜上所述,synchronized 和 Lock 都可以用于實(shí)現(xiàn)線程的同步,但在使用方式、性能和靈活性等方面存在一些區(qū)別。根據(jù)具體的場(chǎng)景和需求,選擇合適的鎖機(jī)制對(duì)于保障線程安全和提高并發(fā)性能非常重要。希望通過(guò)本文的介紹,能夠?qū)?synchronized和Lock的區(qū)別有更加清晰的認(rèn)識(shí)。如果你對(duì)這方面的知識(shí)還有疑問(wèn)或者有其他技術(shù)問(wèn)題想要分享討論,歡迎在評(píng)論區(qū)留言,我會(huì)及時(shí)回復(fù)。謝謝!

好兄弟可以點(diǎn)贊并關(guān)注我的公眾號(hào)“javaAnswer”,全部都是干貨。




Java并發(fā)編程大揭秘:synchronized和Lock誰(shuí)更勝一籌?的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
乌审旗| 镇康县| 云梦县| 额尔古纳市| 陕西省| 太原市| 米林县| 抚州市| 玛多县| 大化| 吉木萨尔县| 西华县| 磐石市| 班玛县| 余姚市| 石家庄市| 寿光市| 会宁县| 宁波市| 莒南县| 西平县| 涪陵区| 商丘市| 九台市| 博客| 长阳| 河源市| 五寨县| 固原市| 启东市| 郓城县| 安新县| 大冶市| 阿巴嘎旗| 双柏县| 淮安市| 昔阳县| 阿鲁科尔沁旗| 滨州市| 铜陵市| 和静县|