總結synchronized

一.synchronized的特性

??synchronized 是 Java 語言中內置的關鍵字,用于實現線程同步,以確保多線程環境下共享資源的安全訪問。

  1. 互斥性:synchronized保證了同一時刻只有一個線程可以執行被synchronized修飾的代碼塊或方法。當一個線程進入synchronized代碼塊或方法時,其他線程必須等待,直到該線程執行完畢并釋放鎖。

  2. 可重入性:同一個線程可以多次獲得同一個對象的鎖。如果一個線程已經獲取了對象的鎖,在持有鎖的情況下再次進入由synchronized修飾的代碼塊或方法,不會產生死鎖,而是允許繼續訪問。

  3. 保證可見性:synchronized不僅保證了線程的互斥執行,還保證了共享變量的可見性。當一個線程釋放鎖時,會將對共享變量的修改刷新到主內存中,而其他線程在獲取鎖時會從主內存中重新讀取該變量的值。

  4. 原子性:將代碼塊或方法聲明為synchronized可以保證其操作的原子性。即一組操作要么全部執行成功,要么全部不執行。

  5. 阻塞和喚醒機制:當一個線程嘗試獲取一個被其他線程占用的鎖時,該線程會進入阻塞狀態,直到鎖被釋放。當持有鎖的線程執行完畢并釋放鎖時,會喚醒等待的線程,使其可以繼續執行

二.synchronized的使用

synchronized關鍵字可以用于修飾方法或代碼塊,以實現線程的同步和互斥控制。

修飾方法:

public synchronized void someMethod() {// 代碼塊
}

當一個方法被synchronized修飾時,該方法被稱為同步方法。同一時刻只允許一個線程執行該方法,其他線程需要等待。該方法的鎖對象是調用該方法的實例對象(對于靜態方法,則為類對象)。同步方法的鎖范圍是整個方法體,從方法進入到結束。

修飾代碼塊:

public void someMethod() {synchronized (lockObject) {// 代碼塊}
}

通過synchronized修飾代碼塊,可以在一段具體的代碼范圍內進行同步。代碼塊中的鎖對象可以是任意對象,通常使用專門為此目的創建的對象或this關鍵字引用當前對象。同步的目的是為了保證在同一時刻只允許一個線程進入該代碼塊執行。


synchronized的使用可以保證共享數據(例如對象的實例變量)在多個線程之間的正確訪問,避免數據競爭和不一致的情況發生。當一個線程進入synchronized方法或代碼塊時,它會獲取鎖,并且在退出方法或代碼塊時釋放鎖,使得其他等待鎖的線程可以繼續執行。

三.synchronized的鎖機制

對象鎖:synchronized 關鍵字使用對象鎖來實現同步。每個對象都有一個內置的鎖(monitor)和一個與之關聯的等待隊列。

? 鎖獲取:當一個線程進入同步代碼塊或同步方法時,將嘗試獲取與鎖對象關聯的 monitor。如果 monitor 未被其他線程占用,該線程將獲得鎖并執行同步代碼;如果 monitor 被其他線程占用,該線程將進入等待隊列并等待鎖。

? 鎖釋放:當線程執行完同步代碼塊或同步方法后,它將釋放鎖并喚醒等待隊列中的一個線程(如果存在)。

需要注意的是,synchronized的鎖是非公平的。這意味著當多個線程同時競爭一個對象的鎖時,無法保證哪個線程會獲得鎖。通常情況下,JVM會選擇一個等待時間最長的線程來獲得鎖。

除了內置的對象鎖之外,Java還提供了其他類型的鎖,如ReentrantLock和ReadWriteLock,它們提供了更高級的鎖機制,如可重入、公平性控制、條件變量等特性

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

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

相關文章

使用GraphQL在Postman中進行API測試

GraphQL 是一種用于API的開源數據查詢和操作語言,用于API的查詢語言和運行時。它使客戶端能夠精確地指定其數據需求,并獲得預測性地結果。GraphQL旨在提高API的效率、靈活性和可靠性。 Postman 是一款用于API開發的強大工具,它支持REST和Gra…

LVS簡介及LVS-DR搭建

目錄 一. LVS簡介: 1.簡介 2. LVS工作模式: 3. LVS調度算法: 4. LVS-DR集群介紹: 二.LVS-DR搭建 1.RS配置 1)兩臺RS,需要下載好httpd軟件并準備好配置文件 2)添加虛擬IP(vip&…

Python爬蟲——requests_cookie登陸古詩文網

尋找登陸需要的參數 __VIEWSTATE:aiMG0UXAfCzak10C7436ZC/RXoZbM2lDlX1iU/4wjjdUNsW8QUs6W2/3M6XIKagQZrC7ooD8Upj8uCnpQMXjDAp6fS/NM2nGhnKO0KOSXfT3jGHhJAOBouMI3QnlpJCQKPXfVDJPYwh169MGLFC6trY __VIEWSTATEGENERATOR: C93BE1AE from: http://so.gushiwen.cn/user/collect.…

linux 命令--查看網絡端口命令

使用 netstat 檢查端口 netstat 是一個命令行工具,可以提供有關網絡連接的信息。 netstat - atulnp會顯示所有端口和所有對應的程序,用grep管道可以過濾出想要的字段 -a :all,表示列出所有的連接,服務監聽&#xff…

Android JNI開發從0到1,java調C,C調Java,保姆級教程詳解

前些天發現了一個蠻有意思的人工智能學習網站,8個字形容一下"通俗易懂,風趣幽默",感覺非常有意思,忍不住分享一下給大家。 👉點擊跳轉到教程 第一步首先配置Android studio的NDK開發環境,首先在Android studio中下載NDK…

如何防止CSRF攻擊

背景 隨著互聯網的高速發展,信息安全問題已經成為企業最為關注的焦點之一,而前端又是引發企業安全問題的高危據點。在移動互聯網時代,前端人員除了傳統的 XSS、CSRF 等安全問題之外,又時常遭遇網絡劫持、非法調用 Hybrid API 等新…

Java超級瑪麗小游戲制作過程講解 第六天 創建背景類

package com.sxt;import java.awt.image.BufferedImage;public class BackGround {//當前場景要顯示的圖像 private BufferedImage bgImagenull;//記錄當前是第幾個場景 private int sort;//判斷是否是最后一個場景 private boolean flag;public BackGround(){}public BackGrou…

【CGroupAndroid實踐篇】四、Native Service進程啟動及控制組遷移

寫在前面 承接上一篇,在cgroup子系統初始化完成后,init會繼續執行開機流程,且通過代哦用ExecuteCommand()函數。 /system/core/init/init.cppint SecondStageMain(int argc, char** argv) {......ActionManager& am = ActionManager::GetInstance();am.ExecuteOneCo…

ASIC芯片設計全流程項目實戰課重磅上線 ,支持 65nm制程流片 !

全流程項目實戰課學什么? 此次推出【 ASIC芯片設計全流程項目實戰課】,基于IPA圖像處理加速器,以企業級真實ASIC項目為案例,學員可參與全流程項目實踐,以及65nm真實流片! 眾所周知,放眼整個IC碩…

【Linux】【驅動】驅動框架以及掛載驅動

【Linux】【驅動】驅動框架以及掛載驅動 緒論1.配置開發環境2. 編寫驅動文件3. 編譯Makefile文件4.編譯5. 掛載驅動注意:有些開發板打開了或者禁止了printk信息,導致你看到的實驗現象可能不一樣,此時已經將文件移動到了開發板中,開發板查看文…

Flink CEP(Complex Event Processing)庫

復雜事件處理(Complex Event Processing,CEP)是一種用于在流式數據中識別和處理復雜事件模式的技術。Apache Flink 作為一個流式處理框架,也可以用于實現復雜事件處理。下面是 Flink 中實現復雜事件處理的一般原理: 事…

WebRTC音視頻通話-新增或修改SDP中的碼率Bitrate限制

WebRTC音視頻通話-新增或修改SDP中的碼率Bitrate限制參數 之前搭建ossrs服務,可以查看:https://blog.csdn.net/gloryFlow/article/details/132257196 之前實現iOS端調用ossrs音視頻通話,可以查看:https://blog.csdn.net/gloryFlo…

連接不上手機,adb devices為空:

首先說明一下,我是已經安裝了android studio,也配置了環境變量,但是還是連接不上手機 解決方案: 1.打開開發者模式 https://product.pconline.com.cn/itbk/sjtx/sjwt/1424/14246015.html 2.開啟usb調試 https://baiyunju.cc/10770 最后成功…

Nginx:Web基礎與HTTP協議

目錄 1、dns域名 1.1 dns解析方式: 1.2 域名解析服務器: 2、html 2.1 網頁、網站和主頁、域名 2.2 URL和URI 3、Web(全球廣域網,也稱萬維網) 3.1 靜態頁面 3.1.1 靜態頁面特點 3.2 動態頁面 3.2.1 動態頁面…

什么是CSS的box-sizing屬性?它有哪些取值,各有什么不同?

聚沙成塔每天進步一點點 ? 專欄簡介? CSS的box-sizing屬性? 取值? 不同之處? 寫在最后 ? 專欄簡介 前端入門之旅:探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅!這個專欄是為那些對Web…

關于Vue構建低代碼平臺的思考

一、前言 在項目實戰開發中,尤其是大平臺系統的搭建,針對不同業務場景,需要為用戶多次編寫用于錄入、修改、展示操作的相應表單頁面。一旦表單需求過多,對于開發人員來說,算是一種重復開發,甚至是繁雜的工作…

【C++起飛之路】初級—— auto、范圍for循環、宏函數和內聯函數

auto、范圍for、內聯函數、宏函數和nullptr 一、auto — 類型推導的魔法(C 11)1、auto 是什么?2、工作原理3、優勢4、限制和注意事項 二、范圍for (C11)1、基本語法2、優勢3、工作原理4、注意事項5、C11: 范圍 for 循環的擴展: 三…

軟件測試基礎篇——LAMP環境搭建

LAMP 1、Linux系統的其他命令 find命令:在目錄下查找文件 ? 格式一:find 路徑 參數 文件名 ? 路徑:如果沒有指定路徑,默認是在當前目錄下 ? 參數:-name 根據文件名來查找,區分大小寫; -…

useState() 的使用及場景

useState是 React提供的一個Hook函數,用于在函數組件中添加和管理狀態。它允許你在函數組件中定義一個可變的狀態,并在組件的生命周期中對狀態進行更新和訪問。 使用useState可以避免使用類組件時需要定義和管理繁瑣的constructor,state和se…

HOT83-打家劫舍

leetcode原題鏈接:打家劫舍 題目描述 你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系…