lock 和 synchronized 區別

1. 引言

在多線程編程中,我們經常需要確保某些代碼在同一時刻只由一個線程執行。這種機制通常叫做“互斥鎖”或“同步”。Java 提供了兩種主要的同步機制:synchronized 關鍵字和 Lock 接口。盡管它們的作用相似,都用于實現線程的同步,但在使用和功能上有一些顯著的區別。

本文將詳細對比 synchronizedLock,幫助理解它們的區別和各自的適用場景。

2. synchronized 關鍵字

synchronized 是 Java 中實現線程同步的原生關鍵字,它的作用是確保某個方法或代碼塊在同一時刻只能由一個線程訪問。synchronized 的語法相對簡單,且直接嵌入到方法或代碼塊中。

2.1 基本用法

  • 同步方法:
public synchronized void someMethod() {// 臨界區代碼
}
  • 同步代碼塊:
public void someMethod() {synchronized (this) {// 臨界區代碼}
}

2.2 特性

  • 隱式鎖: synchronized 自動為被同步的方法或代碼塊加上鎖,并在方法執行完后釋放鎖。
  • 不能中斷: 在持有 synchronized 鎖的線程執行過程中,其他線程不能中斷該線程,除非該線程主動釋放鎖。
  • 只能鎖住對象: 鎖的對象是 JVM 中的對象引用,可以是 this,也可以是類對象(對于靜態方法)。
  • 內置機制: synchronized 是 Java 的內置機制,在編譯時由 JVM 自動管理。

3. Lock 接口

Lock 是 Java 提供的一個接口,定義在 java.util.concurrent.locks 包中,屬于顯式鎖的實現。與 synchronized 相比,Lock 提供了更多的靈活性和控制,適合于更復雜的同步場景。

3.1 基本用法

Lock 的常用實現類是 ReentrantLock,使用時需要先創建 Lock 對象,然后手動獲取和釋放鎖。

Lock lock = new ReentrantLock();public void someMethod() {lock.lock();try {// 臨界區代碼} finally {lock.unlock();}
}

3.2 特性

  • 顯式鎖:synchronized 不同,Lock 鎖需要手動控制加鎖和解鎖。
  • 可中斷: Lock 提供了帶有中斷響應的鎖獲取方法。例如,lock.lockInterruptibly() 允許在等待鎖的時候響應中斷。
  • 公平鎖: ReentrantLock 提供了公平性選項,可以保證鎖的獲取按照請求鎖的順序進行(即先來先得)。
  • 可嘗試鎖: Lock 允許嘗試獲取鎖,而不是一直等待,方法如 lock.tryLock() 可以嘗試獲取鎖并返回是否成功。
  • 讀寫鎖: Lock 還提供了 ReadWriteLock 接口,可以將鎖分為讀鎖和寫鎖,提升多線程并發的性能。

4. synchronizedLock 的區別

4.1 鎖的類型和粒度

  • synchronized 鎖住的是對象(實例對象或類對象)。在方法上使用時,鎖住的是方法所屬的對象。
  • Lock 鎖住的是一個顯式的鎖對象,通過 lock.lock() 方法來加鎖,因此可以精確控制鎖的范圍。

4.2 控制粒度和靈活性

  • synchronized 鎖的控制較為簡單和粗糙,不能靈活控制線程的執行。
  • Lock 提供更多的控制方法(如 lockInterruptibly()tryLock()),支持中斷、超時和公平性等特性,控制靈活。

4.3 鎖的釋放

  • synchronized 鎖的釋放是隱式的,在方法執行完后,JVM 自動釋放鎖,不需要顯式地調用 unlock
  • Lock 鎖的釋放是顯式的,必須手動調用 unlock(),否則可能導致死鎖。

4.4 中斷和超時

  • synchronized 無法響應中斷,一旦進入同步代碼塊或方法,線程就會一直等待,直到獲得鎖。
  • Lock 提供了 lockInterruptibly() 方法,可以響應中斷,線程可以在等待鎖的過程中被中斷。

4.5 性能和并發

  • synchronized 在高并發情況下,synchronized 的性能較差,尤其是鎖競爭激烈時,容易導致性能瓶頸。
  • Lock 由于其更靈活的特性,Lock 在高并發下的表現往往優于 synchronized,尤其是在需要公平鎖、嘗試鎖或讀寫鎖的情況下。

5. 使用場景

5.1 使用 synchronized 的場景

  • 代碼簡潔,使用場景不復雜時,synchronized 是一個合適的選擇。
  • 對于普通的互斥同步,使用 synchronized 更簡潔,且由 JVM 自動管理鎖。

5.2 使用 Lock 的場景

  • 需要更多控制的場景,如需要響應中斷、嘗試獲取鎖或實現公平鎖時,Lock 是更好的選擇。
  • 需要在同一方法中多次加鎖并釋放鎖的場景,Lock 提供了更精細的控制。

6. 總結

特性synchronizedLock
鎖的類型自動加鎖,對象鎖顯式加鎖,可以是任何對象
鎖的釋放自動釋放,無法中斷必須手動釋放,支持中斷和超時
中斷響應不支持支持
鎖的公平性不保證可以選擇公平鎖
適用場景代碼簡單的同步場景高并發、需要更多控制的同步場景

通過對比可以看出,synchronized 適合簡單的同步需求,而 Lock 更適合復雜的多線程控制和高并發場景。根據具體的需求選擇合適的同步工具,能有效提高程序的效率和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90590.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90590.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90590.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Tkinter - Python圖形界面開發指南

作者:唐叔在學習 專欄:唐叔學python 標簽:Python GUI編程 Tkinter教程 圖形界面開發 Python實戰 界面設計 事件監聽 Python入門 唐叔Python 編程學習 軟件開發 文章目錄一、Tkinter是什么?為什么選擇它?二、Tkinter基礎…

Java基礎day15

目錄 一、Java集合簡介 1.什么是集合? 2.集合接口 3.小結 二、List集合 1.List集合簡介 三、ArrayList容器類 1.初始化 1.1無參初始化 1.2有參初始化 2.數據結構 3.常用方法 3.1增加元素 3.2查找元素 3.3 修改元素 3.4 刪除元素 3.5 其他方法 4.擴…

React Three Fiber 實現晝夜循環:從光照過渡到日月聯動的技術拆解

在 3D 場景中用 React Three Fiber 實現自然的晝夜循環,核心難點在于光照的平滑過渡、日月運動的聯動邏輯、晝夜狀態下的光影差異處理,以及性能與視覺效果的平衡。本文以一個 ReactThree.js 的實現為例,詳細解析如何通過三角函數計算日月位置…

進階向:基于Python的簡易屏幕畫筆工具

用Python打造你的專屬屏幕畫筆工具:零基礎也能輕松實現你是否曾在觀看網課或參加遠程會議時,想要直接在屏幕上標注重點?或者作為設計師,需要快速繪制創意草圖?現在,只需幾行Python代碼,你就能輕…

Elasticsearch-ik分析器

CLI 安裝步驟 1、停止 Elasticsearch(如果正在運行): 在安裝插件之前,確保 Elasticsearch 沒有在運行。 命令: systemctl stop elasticsearch2、安裝插件: 使用 elasticsearch-plugin 命令安裝 IK 插件。進…

MySQL八股篇

查詢關鍵字執行先后順序FROM(及 JOIN)WHEREGROUP BYHAVINGSELECTDISTINCTORDER BYLIMIT / OFFSETCHAR 和 VARCHAR 的區別?使用場景?特性CHARVARCHAR?存儲方式??定長,存儲時填充空格至定義長度變長,存儲實際數據 長…

QT RCC 文件

RCC (Qt Resource Compiler) 是 Qt 框架中的一個工具,用于將資源文件(如圖像、音頻、翻譯文件等)編譯成二進制格式,并嵌入到應用程序可執行文件中。RCC 文件基本概念作用:將應用程序所需的資源文件編譯成 C 代碼&#…

數據湖典型架構解析:2025 年湖倉一體化解決方案

數據湖架構概述:從傳統模型到 2025 年新范式數據湖作為存儲海量異構數據的中央倉庫,其架構設計直接影響企業數據價值的釋放效率。傳統數據湖架構主要關注數據的存儲和管理,而 2025 年的數據湖架構已經演變為更加智能化、自動化的綜合性數據平…

繪圖庫 Matplotlib Search

關于Pathon的繪圖庫的認識和基本操作的學習 這里學習了兩款常用便捷的繪圖庫去學習使用Matplotlib介紹是最受歡迎的一種數據可視化包 是常用的2D繪圖庫 一般常于Numpy和Pandas使用 是數據分析中非常重要的工具可以自定義XY軸 繪制線形圖 柱狀圖 直方圖 密度圖 散點圖 更清晰的展…

Docker詳解及實戰

🎉 Docker 簡介和安裝 - Docker 快速入門 Docker 簡介 Docker是一個開源的平臺,用于開發、交付和運行應用程序。它能夠在Windows,macOS,Linux計算機上運行,并將某一應用程序及其依賴項打包至一個容器中,這…

嵌入式學習的第三十三天-進程間通信-UDP

一、網絡1.定義不同主機間進程通信主機間在硬件層面互聯互通主機在軟件層面互聯互通2.國際網絡體系結構OSI模型(7層): open system interconnect -------理論模型------定義了網絡通信中不同層的協議1977 國際標準化組織各種不同體系結構的計算機能在世…

4、Spring AI_DeepSeek模型_結構化輸出

一、前言 Spring AI 提供跨 AI 供應商(如 OpenAI、Hugging Face 等)的一致性 API, 通過分裝的ChatModel或ChatClient即可輕松調動LLM進行流式或非流式對話。 本專欄主要圍繞著通過OpenAI兼容接口調用各種大語言模型展開學習(因為大部分模型…

Spring Data Redis 從入門到精通:原理與實戰指南

一、Redis 基礎概念 Redis(Remote Dictionary Server)是開源的內存鍵值對數據庫,以高性能著稱。它支持多種數據結構(String、Hash、List、Set、ZSet),并提供持久化機制(RDB、AOF)。 …

免費版酒店押金原路退回系統——仙盟創夢IDE

項目介紹?東方仙盟開源酒店押金管理系統是一款面向中小型酒店、民宿、客棧的輕量級前臺管理工具,專注于簡化房態管理、訂單處理和押金跟蹤流程。作為完全開源的解決方案,它無需依賴任何第三方服務,所有數據存儲在本地瀏覽器中,確…

10. isaacsim4.2教程-RTX Lidar 傳感器

1. 前言RTX Lidar 傳感器Isaac Sim的RTX或光線追蹤Lidar支持通過JSON配置文件設置固態和旋轉Lidar配置。每個RTX傳感器必須附加到自己的視口或渲染產品,以確保正確模擬。重要提示: 在運行RTX Lidar仿真時,如果你在Isaac Sim UI中停靠窗口&…

QT6 源,七章對話框與多窗體(14)棧式窗體 QStackedWidget:本類里代碼很少。舉例,以及源代碼帶注釋。

(1)這不是本章節要用到的窗體組件,只是跟著標簽窗體 QTabWidget 一起學了。這也是 QT 的 UI 界面里的最后幾個容器了。而且本類也很簡單。就了解一下它。 本類的繼承關系如下 : UI 設計界面 :運行效果 :&…

魔百和M401H_國科GK6323V100C_安卓9_不分地區免拆卡刷固件包

魔百和M401H_國科GK6323V100C_安卓9_不分地區免拆卡刷固件包刷機說明:1,進機頂盒設置(密碼10086),在其他里,一直按左鍵約32下,打開調試模式2,進網絡設置,查看IP地址。3&a…

MySQL基礎02

一. 函數在 MySQL 中,函數是用于對數據進行特定處理或計算的工具,根據作用范圍和返回結果的不同,主要分為單行函數和聚合函數(又稱分組函數)。以下是詳細介紹:1.單行函數單行函數對每一行數據單獨處理&…

LabVIEW 視覺檢測SIM卡槽

針對SIM 卡槽生產中人工檢測效率低、漏檢誤檢率高的問題,設計了基于 LabVIEW 機器視覺的缺陷檢測系統。該系統通過光學采集與圖像處理算法,實現對卡槽引腳折彎、變形、漏銅等缺陷的自動檢測,誤報率為 0,平均檢測時間小于 750ms&am…

RocketMQ5.3.1的安裝

1、下載安裝 RocketMQ 的安裝包分為兩種,二進制包和源碼包。1 下載 Apache RocketMQ 5.3.1的源碼包后上傳到linux https://dist.apache.org/repos/dist/release/rocketmq/5.3.1/rocketmq-all-5.3.1-source-release.zip2 解壓編譯 $ unzip rocketmq-all-5.3.1-source…