成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開(kāi)發(fā) 前端
synchronized 和 Lock 都可以用于實(shí)現(xiàn)線程的同步,但在使用方式、性能和靈活性等方面存在一些區(qū)別。根據(jù)具體的場(chǎng)景和需求,選擇合適的鎖機(jī)制對(duì)于保障線程安全和提高并發(fā)性能非常重要。

大家好,我是小米,在日常的開(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ù)。謝謝!

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2024-07-31 09:39:33

2022-07-20 08:16:54

Lombokjava工具

2018-06-12 10:09:41

編程語(yǔ)言PythonJava

2020-03-06 09:21:28

PWA原生應(yīng)用Web

2010-05-28 11:21:17

2014-03-06 15:07:41

青橙小米

2023-08-09 18:08:35

ChatGPTStackOverflow

2020-02-02 15:42:22

PythonC++編程語(yǔ)言

2017-01-11 14:38:39

編程語(yǔ)言Java

2020-01-18 14:55:03

架構(gòu)運(yùn)維技術(shù)

2010-07-27 14:36:31

Flex Array

2010-05-21 16:36:09

GoogleCode

2017-11-13 15:38:03

VMwareOpenStack混合云

2023-08-23 15:14:13

Web開(kāi)發(fā)Javascript編程語(yǔ)言

2024-09-14 09:14:45

2019-01-04 09:59:14

KafkaRabbitMQMQ

2018-10-12 13:54:26

2025-01-03 09:27:14

2017-06-08 15:38:41

2013-02-19 13:13:33

SurfaceiPad
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文在线a在线 | 91av视频 | 日批免费观看 | 亚洲成人毛片 | 日韩精品久久久久久 | 男人天堂99 | 亚洲精品久久久久久一区二区 | 国产一区二区三区免费 | 国产精品一区视频 | 国产精品亚洲一区 | av一二三四 | 亚洲精品4| 久久99深爱久久99精品 | 天堂免费 | 中文字幕免费视频 | 日韩一级免费大片 | 亚洲一区二区在线播放 | 毛片在线看片 | 九色视频网站 | 中文字幕在线欧美 | 精产国产伦理一二三区 | 精品一区二区三区在线观看国产 | 日本中文字幕在线观看 | 97色在线视频 | 成人动漫视频网站 | 欧美一区二区三区 | 久久成人免费视频 | m豆传媒在线链接观看 | 中国大陆高清aⅴ毛片 | 久久久精品一区二区三区四季av | 亚洲色图50p| 欧美日韩成人在线观看 | 日韩国产三区 | 欧美日韩精品在线一区 | caoporn地址| 欧美精品 在线观看 | 日本一区二区高清视频 | 国产视频二区在线观看 | 亚洲精品一区中文字幕乱码 | 91社区在线观看 | 国产视频亚洲视频 |