synchronized 鎖的到底是什么?

?通過8種情況演示鎖運行案例,看看我們到底鎖的是什么


1鎖相關的8種案例演示code

package com.bilibili.juc.lock;import java.util.concurrent.TimeUnit;/*** 題目:談談你對多線程鎖的理解,8鎖案例說明* 口訣:線程 操作 資源類* 8鎖案例說明:* 1. 標準訪問ab兩個線程,請問先打印郵件還是短信? --------先郵件,后短信  共用一個對象鎖* 2. sendEmail鐘加入暫停3秒鐘,請問先打印郵件還是短信?--------先郵件,后短信  共用一個對象鎖* 3. 添加一個普通的hello方法,請問先打印普通方法還是郵件? --------先hello,再郵件  資源沒有爭搶,hello方法沒有用到對象鎖* 4. 有兩部手機,請問先打印郵件還是短信? --------先短信后郵件  資源沒有爭搶,不是同一個對象鎖* 5. 有兩個靜態同步方法,一部手機, 請問先打印郵件還是短信?--------先郵件后短信  共用一個類鎖* 6. 有兩個靜態同步方法,兩部手機, 請問先打印郵件還是短信? --------先郵件后短信  共用一個類鎖* 7. 有一個靜態同步方法,一個普通同步方法,一部手機,請問先打印郵件還是短信? --------先短信后郵件  一個類鎖一個對象鎖* 8. 有一個靜態同步方法,一個普通同步方法,兩部手機,請問先打印郵件還是短信? ---------先短信后郵件  一個類鎖一個對象鎖*/
public class Lock8Demo {public static void main(String[] args) {Phone phone = new Phone();Phone phone2 = new Phone();new Thread(() -> phone.sendEmail(), "a").start();// 暫停200毫秒,保證線程先啟動try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() -> /*phone.sendSMS()*/ /*phone.hello()*/ phone2.sendSMS(), "b").start();}}// 資源類
class Phone {public static synchronized void sendEmail() {try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("--------sendEmail--------");}public /*static*/ synchronized void sendSMS() {System.out.println("--------sendSMS--------");}public void hello() {System.out.println("--------hello--------");}
}

2案例總結


1-2:

一個對象里面如果有多個 synchronized 方法,某一個時刻內,只要一個線程去調用其中的一個synchronized方法,其它線程都只能等待。換句話說,某一個時刻內,只能有唯一的一個線程去訪問這些synchronized方法。鎖的是當前對象this,被鎖定后,其它線程都不能進入到當前對象的其它的synchronized方法

3-4:

加個普通方法后發現和同步鎖無關

換成兩個對象后,不是同一把鎖了,情況立即變化

5-6:

都換成靜態同步方法后,情況又變化

三種synchronized鎖的內容有一些差別:

對于普通同步方法(被synchronized修飾的成員方法),鎖的是當前實例對象,通常指this,所有的同步方法用的都是同一把鎖—>實例對象本身(即Phone phone = new Phone();)
對于靜態同步方法(被synchronized修飾的靜態方法),鎖的是當前類的Class對象,即Phone.class唯一的一個模板
對于同步方法塊,鎖的是synchronized括號內的對象

7-8:

當一個線程試圖訪問同步代碼時,它首先必須得到鎖,正常退出或拋出異常時必須釋放鎖

所有的普通同步方法用的都是同一把鎖——實例對象本身,就是new出來的具體實例對象本身,本類this。也就是說如果一個實例對象的普通同步方法獲取鎖后,該實例對象的其它普通同步方法必須等待獲取鎖的方法釋放鎖后才能獲取鎖

所有的靜態方法用的也是同一把鎖——類對象本身,就是我們說過的唯一模板class。具體實例對象this和唯一模板class,這兩把鎖是兩個不同的對象,所以靜態同步方法和普通同步方法之間是不會有競態條件的。但是一旦一個靜態同步方法獲取鎖后,其它的靜態同步方法都必須等待該方法釋放鎖后才能獲取鎖

如圖中Car Class就是模板,存放在虛擬機中的方法區/元空間,Car Class這個模板就只有一份。但是Car的實例對象,如:car1、car2、car3都在堆內存中,可以有多個。所以說Car Class和car實例加鎖的地方和對象都不一樣。運行效果也不一樣。

  • 作用于實例方法,當前實例加鎖,進入同步代碼塊前要獲得當前實例的鎖;
  • 作用于代碼塊,對括號里配置的對象加鎖
  • 作用于靜態方法,當前類加鎖,進去同步代碼前要獲得當前類對象的鎖

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

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

相關文章

修改hostname導致RabbitMQ數據丟失

背景介紹 公司的很多關鍵服務都使用了RabbitMQ來作為消息隊列服務, 可以說是非常地關鍵的一個環節, 最近由于業務量的上升, 導致RabbitMQ的CPU持續走高, 所以抽空研究了一下RabbitMQ的擴容, 利用我們自己運維平臺使用的一個單節點的RabbitMQ來作為測試吧.看到這個單節點的Rabbi…

第十七節 huggingface的trainner的斷點續訓的Demo(resume)

文章目錄 前言一、參數決定權重保存1、model.safetensors保存2、scaler.pt保存3、optimizer.pt與scheduler.pt保存4、self.state狀態保存(trainer_state.json)5、rng_state.pth保存6、權重相關保存位置(huggingface)二、Resume的Demo1、Demo構建2、實現Resume方法三、Resume訓…

005 CentOS 7.9 RabbitMQ安裝及配置

https://github.com/rabbitmq/rabbitmq-server/releases https://www.rabbitmq.com/docs/download https://packagecloud.io/rabbitmq/rabbitmq-server https://www.erlang-solutions.com/downloads/ https://www.erlang.org/ 文章目錄 卸載erlerl版本安裝與下載版本不匹配正…

AI技術的深度探索:重塑未來的智能引擎

隨著科技的迅猛進步,人工智能(AI)技術已經逐漸滲透到我們生活的每一個角落,從簡單的智能助手到復雜的決策支持系統,AI技術以其獨特的方式和前所未有的速度改變著我們的世界。本文將對AI技術進行深入探討,從…

開源貢獻 | 基于長安鏈去中心化數字身份合約標準協議(CMDID-1)的DID

DID為每個實體(人、組織、物品等)提供了一個唯一的全球身份標識符,讓用戶可以控制和管理的自己的數字身份,并在使用時以最小化的方式出示,將數據所有權歸還用戶的同時以區塊鏈技術保證了身份的不可篡改性,以…

LeetCode875愛吃香蕉的阿珂

題目描述 珂珂喜歡吃香蕉。這里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警衛已經離開了,將在 h 小時后回來。珂珂可以決定她吃香蕉的速度 k (單位:根/小時)。每個小時,她將會選擇一堆香蕉,從…

IntelliJ IDEA / Android Studio 方法顯示Git提交人

顯示方法: 設置 > 編輯器 > 嵌入提示 > Code Vision > 代碼作者(勾選) IntelliJ IDEA Android Studio

springboot編寫日志環境搭建過程

AOP記錄日志 AOP記錄日志的主要優點包括: 1、低侵入性:AOP記錄日志不需要修改原有的業務邏輯代碼,只需要新增一個切面即可。 2、統一管理:通過AOP記錄日志可以將各個模塊中需要記錄日志的部分進行統一管理,降低了代…

神經網絡的工程基礎(二)——隨機梯度下降法|文末送書

相關說明 這篇文章的大部分內容參考自我的新書《解構大語言模型:從線性回歸到通用人工智能》,歡迎有興趣的讀者多多支持。 本文涉及到的代碼鏈接如下:regression2chatgpt/ch06_optimizer/stochastic_gradient_descent.ipynb 本文將討論利用…

WinApp自動化測試之輔助工具介紹

前篇文章中,我們簡單介紹了部分WinApp自動化測試腳本常規操作,今天我們來講剩余的部分。 文件批量上傳 文件批量上傳和文件單個上傳原理是相同的,單個上傳直接傳入文件路徑即可,批量上傳需要進入批量上傳的文件所在目錄&#xf…

Redis到底是AP還是CP?

這個問題差評,沒問清楚。當然,網上一搜,各種各樣的狗屁答案都有,有時候是AP的,有時候是CP的,薛定諤的Redis。 好的,那應該怎么問呢?Q1.Redis Cluster集群是AP還是CP? A…

uniapp創建支付密碼實現(初始密碼,第二次密碼)

示例: 插件地址:自定義數字/身份證/密碼輸入框,鍵盤密碼框可分離使 - DCloud 插件市場 1.下載插件并導入HBuilderX,找到文件夾,copy number-keyboard.vue一份為number-keyboard2.vue(number-keyboard.vue是…

C++ STL map容器erase操作避坑

map容器的erase方法有三種重載形式: //1.刪除迭代器所指向的元素 //返回值是指向下一個節點的迭代器 iterator erase(iterator it); //2.區間刪除 iterator erase(iterator first, iterator last); //3.根據鍵值刪除 //返回值為刪除的元素個數 size_type erase(con…

民國漫畫雜志《時代漫畫》第37期.PDF

時代漫畫37.PDF: https://url03.ctfile.com/f/1779803-1248636302-c017ee?p9586 (訪問密碼: 9586) 《時代漫畫》的雜志在1934年誕生了,截止1937年6月戰爭來臨被迫停刊共發行了39期。 ps: 資源來源網絡!

C++基礎編程100題-002 OpenJudge-1.1-04 輸出保留3位小數的浮點數

更多資源請關注紐扣編程微信公眾號 002 OpenJudge-1.1-04 輸出保留3位小數的浮點數 http://noi.openjudge.cn/ch0101/04/ 描述 讀入一個單精度浮點數,保留3位小數輸出這個浮點數。 輸入 只有一行,一個單精度浮點數。 輸出 也只有一行,…

塊設備層保序操作分析

Q:塊設備層保序功能的作用? A:通用塊層可以提交一個帶保序標簽(BIO_RW_BARRIER)的BIO到IO請求隊列,塊設備層可以保證在保序BIO之前提交的BIO都先于BIO執行且抵達存儲介質;保序BIO執行完畢后,它需要寫入的數據必定已經抵達存儲介質;在保序IO之后提交的BIO都晚于保序BIO執行,確保…

07.爬蟲---使用session發送請求

07.使用session發送請求 1.目標網站2.代碼實現 1.目標網站 我們以這個網站作為目標網站 http://www.360doc.com/ 注冊用戶 注冊后從登錄界面獲取到這些信息 2.代碼實現 import requestssession requests.Session() url http://www.360doc.com/ajax/login/login.ashx u…

深入剖析Java線程池的核心概念與源碼解析:從Executors、Executor、execute逐一揭秘

文章目錄 文章導圖前言Executors、Executor、execute對比剖析Executors生成的線程池?線程池中的 execute 方法execute 方法的作用execute的工作原理拒絕策略 源碼分析工作原理基本知識線程的狀態線程池的狀態線程池狀態和線程狀態總結線程池的狀態信息和線程數量信息…

RedisSearch與Elasticsearch:技術對比與選擇指南

碼到三十五 : 個人主頁 數據時代,全文搜索已經成為許多應用程序中不可或缺的一部分。RedisSearch和Elasticsearch是兩個流行的搜索解決方案,它們各自具有獨特的特點和優勢。本文簡單探討一些RedisSearch和Elasticsearch之間的技術差異。 目錄…

9款實用而不為人知的小眾軟件推薦!

AI視頻生成:小說文案智能分鏡智能識別角色和場景批量Ai繪圖自動配音添加音樂一鍵合成視頻https://aitools.jurilu.com/ 在電腦軟件的浩瀚海洋中,除了那些廣為人知的流行軟件外,還有許多簡單、干凈、功能強大且注重實用功能的小眾軟件等待我們…