色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:16日期:2022-08-15 15:43:56
前言

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

目錄

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

1. 定義

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

2. 作用

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

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

3. 應(yīng)用場(chǎng)景

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

修飾 實(shí)例方法 / 代碼塊時(shí),(同步)保護(hù)的是同一個(gè)對(duì)象方法的調(diào)用 & 當(dāng)前實(shí)例對(duì)象修飾 靜態(tài)方法 / 代碼塊時(shí),(同步)保護(hù)的是 靜態(tài)方法的調(diào)用 & class 類對(duì)象

4. 原理

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

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

5. 具體使用

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

5.1 使用規(guī)則

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

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

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

之間的區(qū)別

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

5.3 使用方式

/** * 對(duì)象鎖 */ public class Test{ // 對(duì)象鎖:形式1(方法鎖) public synchronized void Method1(){ System.out.println('我是對(duì)象鎖也是方法鎖'); try{ Thread.sleep(500); } catch (InterruptedException e){ e.printStackTrace(); } } // 對(duì)象鎖:形式2(代碼塊形式) public void Method2(){ synchronized (this){ System.out.println('我是對(duì)象鎖'); try{ Thread.sleep(500); } catch (InterruptedException e){ e.printStackTrace(); } } } }/** * 方法鎖(即對(duì)象鎖中的形式1) */ public synchronized void Method1(){ System.out.println('我是對(duì)象鎖也是方法鎖'); try{ Thread.sleep(500); } catch (InterruptedException e){ e.printStackTrace(); } } /** * 類鎖 */public class Test{ // 類鎖:形式1 :鎖靜態(tài)方法 public static synchronized void Method1(){ System.out.println('我是類鎖一號(hào)'); try{ Thread.sleep(500); } catch (InterruptedException e){ e.printStackTrace(); } } // 類鎖:形式2 :鎖靜態(tài)代碼塊 public void Method2(){ synchronized (Test.class){ System.out.println('我是類鎖二號(hào)'); try{ Thread.sleep(500); } catch (InterruptedException e){ e.printStackTrace(); } } } }

5.4 特別注意

Synchronized修飾方法時(shí)存在缺陷:若修飾1個(gè)大的方法,將會(huì)大大影響效率

示例

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

解決方案

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

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

代碼如下 synchronized(syncObject) { // 訪問(wèn)或修改被鎖保護(hù)的共享狀態(tài) // 上述方法 必須 獲得對(duì)象 syncObject(類實(shí)例或類)的鎖}6. 特點(diǎn)

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

注:原子性、可見(jiàn)性、有序性的定義

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

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

7.1 Lock、ReentrantLock 簡(jiǎn)介

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

區(qū)別

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

7.2 CAS

7.2.1 定義

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

synchronized鎖住的代碼塊:同一時(shí)刻只能由一個(gè)線程訪問(wèn),屬于悲觀鎖

7.2.2 原理

// CAS的操作參數(shù)內(nèi)存位置(A)預(yù)期原值(B)預(yù)期新值(C)// 使用CAS解決并發(fā)的原理:// 1. 首先比較A、B,若相等,則更新A中的值為C、返回True;若不相等,則返回false;// 2. 通過(guò)死循環(huán),以不斷嘗試嘗試更新的方式實(shí)現(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)點(diǎn)

資源耗費(fèi)少:相對(duì)于synchronized,省去了掛起線程、恢復(fù)線程的開銷

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

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

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

7.2.5 典型應(yīng)用:AtomicInteger

對(duì) i++ 與 i?,通過(guò)compareAndSet & 一個(gè)死循環(huán)實(shí)現(xiàn)

而compareAndSet函數(shù)內(nèi)部 = 通過(guò)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é)

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

到此這篇關(guān)于Java的Synchronized關(guān)鍵字學(xué)習(xí)指南的文章就介紹到這了,更多相關(guān)Java的Synchronized關(guān)鍵字內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 欧美videofree性欧美另类 | 一区二区三区四区视频在线观看 | 亚洲码一区二区三区 | 欧美日韩成人午夜免费 | 日本免费在线一区 | 99久久免费午夜国产精品 | 国产精品久久久久久久久99热 | 特级a欧美孕妇做爰片毛片 特级a欧美做爰片毛片 | 欧美特黄aaaaaa | 日韩欧免费一区二区三区 | 久久国产影院 | 欧美激情久久久久久久大片 | 国产99视频精品免视看9 | 成人做爰www | 色偷偷亚洲偷自拍 | 久久免费视屏 | 国产亚洲视频在线播放大全 | 国产成人精品免费视频大全可播放的 | 亚洲最新视频在线观看 | 日本加勒比在线观看 | 久久在线精品 | 国产视频在线免费观看 | 国产精品久久国产精品99 | 欧美老头老太做爰xxxx | 在线精品国产 | 国内外成人免费在线视频 | 国产精品吹潮在线播放 | 日韩在线一区二区三区 | 国产在线精品一区二区中文 | 国产欧美日韩在线一区二区不卡 | 日本三级香港三级人妇gg在线 | 国产成人精品久久 | 黄色免费看片网站 | 俄罗斯极品美女毛片免费播放 | 亚洲成人手机在线 | 国产三级日产三级日本三级 | 日本草草视频在线观看 | 91精品人成在线观看 | 毛片女| 国产精品hd免费观看 | 美女扒开腿让男生桶爽网站 |