自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

synchronized 與 lock 的區(qū)別

  • 存在層次:synchronized 是 Java 語言內(nèi)置的關(guān)鍵字,屬于 JVM 層面的鎖;而 lock 是 Java 類庫提供的一個類,屬于 Java 語言層面的鎖。
  • 鎖的獲取方式:synchronized 的獲取方式是隱式的,即在進入同步代碼塊或方法時自動獲取鎖,并在退出時自動釋放鎖;而 lock 的獲取方式是顯式的,需要手動調(diào)用lock() 方法獲取鎖,并在使用完后手動調(diào)用 unlock() 方法釋放鎖。
  • 鎖的釋放:synchronized 的鎖是在出現(xiàn)異常或者執(zhí)行完同步代碼塊或方法后自動釋放的;而 lock 需要在 finally 塊中手動調(diào)用 unlock() 方法釋放鎖,否則可能導(dǎo)致死鎖。
  • 鎖類型:synchronized 只有一種類型的鎖,即互斥鎖,它是非公平鎖;而 lock 提供了多種類型的鎖,包括公平鎖和非公平鎖。
  • 性能:synchronized 是 JVM 內(nèi)置的鎖,效率相對較低,因為它會涉及到用戶態(tài)和內(nèi)核態(tài)的切換;而 lock 是Java 類庫提供的鎖,性能較高,因為它使用了更底層的硬件級別的實現(xiàn)。
  • 支持鎖的場景:synchronized 只支持在代碼塊和方法上加鎖;而 lock 支持更靈活的加鎖和釋放方式,例如可以在任意位置加鎖和釋放鎖,支持多個條件變量的使用。
  • 可重入性:synchronized 是可重入鎖,即同一線程可以多次獲取同一把鎖而不會死鎖;而 lock 也是可重入鎖,但需要注意要手動調(diào)用相同次數(shù)的 unlock() 方法才能完全釋放鎖。
  • 等待通知機制:synchronized使用的是wait()和notify()/notifyAll() 方法實現(xiàn)線程之間的等待和通知機制;而 lock 使用的是 Condition 對象來實現(xiàn)類似的功能。
  • 可見性:synchronized 在進入同步代碼塊時會自動獲取鎖并刷新線程的工作內(nèi)存,保證了線程間的可見性;而lock 需要手動使用 volatile 關(guān)鍵字或者顯式調(diào)用 lock() 和 unlock() 方法來保證可見性。
  • 鎖的粒度:synchronized 是對整個對象進行加鎖的,即當(dāng)一個線程獲得了某個對象的鎖后,其他線程無法獲得該對象的任何鎖;而 lock 可以實現(xiàn)更細粒度的鎖定,例如可以對對象的某個屬性或者某一段代碼塊進行加鎖,從而提高并發(fā)性能。

synchronized的加鎖流程

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

  • 偏向鎖:當(dāng)一個線程訪問同步代碼塊時,會先檢查對象頭中的 Mark Word,如果發(fā)現(xiàn)沒有被其他線程鎖定,就會將當(dāng)前線程 ID 記錄到 Mark Word 中,并將 Mark Word 設(shè)置為偏向鎖。以后該線程再次訪問同步代碼塊時,無需重新獲取鎖,而是直接使用偏向鎖,從而避免了大部分的同步操作,提高了性能。
  • 輕量級鎖:當(dāng)多個線程同時訪問同步代碼塊時,會發(fā)生輕量級鎖的競爭。這時,JVM 會嘗試將對象頭中的 Mark Word 設(shè)置為輕量級鎖,并將當(dāng)前線程的 ID 記錄在鎖記錄(Lock Record)中。如果競爭不激烈,當(dāng)前線程可以順利獲取輕量級鎖,執(zhí)行同步操作;如果競爭激烈,獲取輕量級鎖失敗,會升級為重量級鎖。
  • 重量級鎖:當(dāng)輕量級鎖競爭失敗或者鎖對象已經(jīng)被設(shè)置為重量級鎖時,會升級為重量級鎖。重量級鎖使用操作系統(tǒng)的互斥量來實現(xiàn),會導(dǎo)致線程的阻塞和喚醒,性能較差。

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

實際案例

下面,我通過兩個電商項目的實際案例來演示 synchronized 和lock 的區(qū)別。

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

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

使用Lock:

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

END

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

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

2024-07-31 09:39:33

2018-06-12 10:09:41

編程語言PythonJava

2022-07-20 08:16:54

Lombokjava工具

2020-03-06 09:21:28

PWA原生應(yīng)用Web

2010-05-28 11:21:17

2014-03-06 15:07:41

青橙小米

2017-01-11 14:38:39

編程語言Java

2023-08-09 18:08:35

ChatGPTStackOverflow

2020-02-02 15:42:22

PythonC++編程語言

2020-01-18 14:55:03

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

2010-05-21 16:36:09

GoogleCode

2010-07-27 14:36:31

Flex Array

2017-11-13 15:38:03

VMwareOpenStack混合云

2024-09-14 09:14:45

2023-08-23 15:14:13

Web開發(fā)Javascript編程語言

2018-10-12 13:54:26

2019-01-04 09:59:14

KafkaRabbitMQMQ

2025-01-03 09:27:14

2013-02-19 13:13:33

SurfaceiPad

2017-06-08 15:38:41

點贊
收藏

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