最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java的Synchronized關(guān)鍵字學習指南(全面 & 詳細)

 更新時間:2021年03月05日 10:16:16   作者:Carson_Ho  
這篇文章主要給大家介紹了關(guān)于Java的Synchronized關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

在Java中,有一個常被忽略 但 非常重要的關(guān)鍵字Synchronized今天,我將詳細講解 Java關(guān)鍵字Synchronized的所有知識,希望你們會喜歡

目錄

示意圖

1. 定義

Java中的1個關(guān)鍵字

2. 作用

保證同一時刻最多只有1個線程執(zhí)行 被Synchronized修飾的方法 / 代碼

其他線程 必須等待當前線程執(zhí)行完該方法 / 代碼塊后才能執(zhí)行該方法 / 代碼塊

3. 應用場景

保證線程安全,解決多線程中的并發(fā)同步問題(實現(xiàn)的是阻塞型并發(fā)),具體場景如下:

修飾 實例方法 / 代碼塊時,(同步)保護的是同一個對象方法的調(diào)用 & 當前實例對象修飾 靜態(tài)方法 / 代碼塊時,(同步)保護的是 靜態(tài)方法的調(diào)用 & class 類對象

4. 原理

依賴 JVM 實現(xiàn)同步底層通過一個監(jiān)視器對象(monitor)完成, wait()、notify() 等方法也依賴于 monitor 對象

監(jiān)視器鎖(monitor)的本質(zhì) 依賴于 底層操作系統(tǒng)的互斥鎖(Mutex Lock)實現(xiàn)

5. 具體使用

Synchronized 用于 修飾 代碼塊、類的實例方法 & 靜態(tài)方法

5.1 使用規(guī)則

示意圖

5.2 鎖的類型 & 等級 由于Synchronized 會修飾 代碼塊、類的實例方法 & 靜態(tài)方法,故分為不同鎖的類型具體如下

示意圖

之間的區(qū)別

示意圖

5.3 使用方式

/**
 * 對象鎖
 */
 public class Test{ 
 // 對象鎖:形式1(方法鎖) 
 public synchronized void Method1(){ 
  System.out.println("我是對象鎖也是方法鎖"); 
  try{ 
   Thread.sleep(500); 
  } catch (InterruptedException e){ 
   e.printStackTrace(); 
  } 
 
 } 
 
 // 對象鎖:形式2(代碼塊形式) 
 public void Method2(){ 
  synchronized (this){ 
   System.out.println("我是對象鎖"); 
   try{ 
    Thread.sleep(500); 
   } catch (InterruptedException e){ 
    e.printStackTrace(); 
   } 
  } 
 
 } 
 }

/**
 * 方法鎖(即對象鎖中的形式1)
 */
 public synchronized void Method1(){ 
  System.out.println("我是對象鎖也是方法鎖"); 
  try{ 
   Thread.sleep(500); 
  } catch (InterruptedException e){ 
   e.printStackTrace(); 
  } 
 
 } 

/**
 * 類鎖
 */
public class Test{ 
   // 類鎖:形式1 :鎖靜態(tài)方法
 public static synchronized void Method1(){ 
  System.out.println("我是類鎖一號"); 
  try{ 
   Thread.sleep(500); 
  } catch (InterruptedException e){ 
   e.printStackTrace(); 
  } 
 
 } 
 
 // 類鎖:形式2 :鎖靜態(tài)代碼塊
 public void Method2(){ 
  synchronized (Test.class){ 
   System.out.println("我是類鎖二號"); 
   try{ 
    Thread.sleep(500); 
   } catch (InterruptedException e){ 
    e.printStackTrace(); 
   } 
 
  } 
 
 } 
}

5.4 特別注意

Synchronized修飾方法時存在缺陷:若修飾1個大的方法,將會大大影響效率

示例

若使用Synchronized關(guān)鍵字修飾 線程類的run(),由于run()在線程的整個生命期內(nèi)一直在運行,因此將導致它對本類任何Synchronized方法的調(diào)用都永遠不會成功

解決方案

使用 Synchronized關(guān)鍵字聲明代碼塊

該解決方案靈活性高:可針對任意代碼塊 & 任意指定上鎖的對象

代碼如下
 synchronized(syncObject) { 
 // 訪問或修改被鎖保護的共享狀態(tài) 
 // 上述方法 必須 獲得對象 syncObject(類實例或類)的鎖
}

6. 特點

示意圖

注:原子性、可見性、有序性的定義

示意圖

7. 其他控制并發(fā) / 線程同步方式

7.1 Lock、ReentrantLock 簡介

示意圖

區(qū)別

示意圖

7.2 CAS

7.2.1 定義

Compare And Swap,即 比較 并 交換,是一種解決并發(fā)操作的樂觀鎖

synchronized鎖住的代碼塊:同一時刻只能由一個線程訪問,屬于悲觀鎖

7.2.2 原理

// CAS的操作參數(shù)
內(nèi)存位置(A)
預期原值(B)
預期新值(C)

// 使用CAS解決并發(fā)的原理:
// 1. 首先比較A、B,若相等,則更新A中的值為C、返回True;若不相等,則返回false;
// 2. 通過死循環(huán),以不斷嘗試嘗試更新的方式實現(xiàn)并發(fā)

// 偽代碼如下
public boolean compareAndSwap(long memoryA, int oldB, int newC){
 if(memoryA.get() == oldB){
  memoryA.set(newC);
  return true;
 }
 return false;
}


7.2.3 優(yōu)點

資源耗費少:相對于synchronized,省去了掛起線程、恢復線程的開銷

但,若遲遲得不到更新,死循環(huán)對CPU資源也是一種浪費

7.2.4 具體實現(xiàn)方式 使用CAS有個“先檢查后執(zhí)行”的操作而這種操作在Java中是典型的不安全的操作,所以 CAS在實際中是由C++通過調(diào)用CPU指令實現(xiàn)的具體過程

// 1. CAS在Java中的體現(xiàn)為Unsafe類
// 2. Unsafe類會通過C++直接獲取到屬性的內(nèi)存地址
// 3. 接下來CAS由C++的Atomic::cmpxchg系列方法實現(xiàn)

7.2.5 典型應用:AtomicInteger

對 i++ 與 i–,通過compareAndSet & 一個死循環(huán)實現(xiàn)

compareAndSet函數(shù)內(nèi)部 = 通過jni操作CAS指令。直到CAS操作成功跳出循環(huán)

 private volatile int value; 
 /** 
  * Gets the current value. 
  * 
  * @return the current value 
  */ 
 public final int get() { 
  return value; 
 } 
 /** 
  * Atomically increments by one the current value. 
  * 
  * @return the previous value 
  */ 
 public final int getAndIncrement() { 
  for (;;) { 
   int current = get(); 
   int next = current + 1; 
   if (compareAndSet(current, next)) 
    return current; 
  } 
 } 
 
 /** 
  * Atomically decrements by one the current value. 
  * 
  * @return the previous value 
  */ 
 public final int getAndDecrement() { 
  for (;;) { 
   int current = get(); 
   int next = current - 1; 
   if (compareAndSet(current, next)) 
    return current; 
  } 
 }

8. 總結(jié)

本文主要對Java中常被忽略 但 非常重要的關(guān)鍵字Synchronized進行講解

到此這篇關(guān)于Java的Synchronized關(guān)鍵字學習指南的文章就介紹到這了,更多相關(guān)Java的Synchronized關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java使用歸并刪除法刪除二叉樹中節(jié)點的方法

    java使用歸并刪除法刪除二叉樹中節(jié)點的方法

    這篇文章主要介紹了java使用歸并刪除法刪除二叉樹中節(jié)點的方法,實例分析了java二叉樹算法的相關(guān)操作技巧,需要的朋友可以參考下
    2015-05-05
  • MAVEN3.9.x中301問題及解決方法

    MAVEN3.9.x中301問題及解決方法

    本文主要介紹了使用MAVEN3.9.x中301問題及解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-01-01
  • Java如何處理json字符串value多余雙引號

    Java如何處理json字符串value多余雙引號

    這篇文章主要介紹了Java如何處理json字符串value多余雙引號,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot項目中使用@Scheduled讀取動態(tài)參數(shù)

    SpringBoot項目中使用@Scheduled讀取動態(tài)參數(shù)

    這篇文章主要介紹了SpringBoot項目中使用@Scheduled讀取動態(tài)參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot統(tǒng)一API響應結(jié)果封裝的示例詳解

    SpringBoot統(tǒng)一API響應結(jié)果封裝的示例詳解

    在Spring Boot項目中,統(tǒng)一API響應結(jié)果封裝是一種常用的技術(shù)實踐,旨在提高開發(fā)效率、降低代碼重復率,并提供一致的API響應格式,從而簡化前后端交互和錯誤處理,感興趣的小伙伴可以了解下
    2025-03-03
  • Spring Data Jpa實現(xiàn)自定義repository轉(zhuǎn)DTO

    Spring Data Jpa實現(xiàn)自定義repository轉(zhuǎn)DTO

    這篇文章主要介紹了Spring Data Jpa實現(xiàn)自定義repository轉(zhuǎn)DTO,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Springboot網(wǎng)站第三方登錄 微信登錄

    Springboot網(wǎng)站第三方登錄 微信登錄

    這篇文章主要為大家詳細介紹了Springboot網(wǎng)站第三方登錄 ,微信登錄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 異常解決SpringBoot項目啟動卡住,無任何異常信息問題

    異常解決SpringBoot項目啟動卡住,無任何異常信息問題

    這篇文章主要介紹了異常解決SpringBoot項目啟動卡住,無任何異常信息問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Java中的線程池ThreadPoolExecutor深入解析

    Java中的線程池ThreadPoolExecutor深入解析

    這篇文章主要介紹了Java中的線程池ThreadPoolExecutor深入解析,線程池,thread pool,是一種線程使用模式,線程池維護著多個線程,等待著監(jiān)督管理者分配可并發(fā)執(zhí)行的任務,需要的朋友可以參考下
    2023-11-11
  • SpringMVC用JsonSerialize日期轉(zhuǎn)換方法

    SpringMVC用JsonSerialize日期轉(zhuǎn)換方法

    下面小編就為大家?guī)硪黄猄pringMVC用JsonSerialize日期轉(zhuǎn)換方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起 小編過來看看吧
    2016-11-11

最新評論

喀喇| 凯里市| 忻州市| 奉化市| 神木县| 南召县| 子洲县| 奇台县| 淳安县| 平遥县| 浦东新区| 酒泉市| 台中县| 万盛区| 大荔县| 都兰县| 攀枝花市| 昆明市| 米易县| 梁山县| 滨州市| 宁海县| 芷江| 庆城县| 重庆市| 陕西省| 茶陵县| 溧水县| 个旧市| 旺苍县| 通化县| 巫山县| 浮梁县| 油尖旺区| 黄冈市| 镇宁| 聊城市| 丽江市| 凤城市| 崇左市| 岐山县|