电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

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

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

目錄

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

1. 定義

Java中的1個關鍵字

2. 作用

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

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

3. 應用場景

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

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

4. 原理

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

監視器鎖(monitor)的本質 依賴于 底層操作系統的互斥鎖(Mutex Lock)實現

5. 具體使用

Synchronized 用于 修飾 代碼塊、類的實例方法 & 靜態方法

5.1 使用規則

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

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

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

之間的區別

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

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 :鎖靜態方法 public static synchronized void Method1(){ System.out.println('我是類鎖一號'); try{ Thread.sleep(500); } catch (InterruptedException e){ e.printStackTrace(); } } // 類鎖:形式2 :鎖靜態代碼塊 public void Method2(){ synchronized (Test.class){ System.out.println('我是類鎖二號'); try{ Thread.sleep(500); } catch (InterruptedException e){ e.printStackTrace(); } } } }

5.4 特別注意

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

示例

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

解決方案

使用 Synchronized關鍵字聲明代碼塊

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

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

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

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

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

7. 其他控制并發 / 線程同步方式

7.1 Lock、ReentrantLock 簡介

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

區別

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

7.2 CAS

7.2.1 定義

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

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

7.2.2 原理

// CAS的操作參數內存位置(A)預期原值(B)預期新值(C)// 使用CAS解決并發的原理:// 1. 首先比較A、B,若相等,則更新A中的值為C、返回True;若不相等,則返回false;// 2. 通過死循環,以不斷嘗試嘗試更新的方式實現并發// 偽代碼如下public boolean compareAndSwap(long memoryA, int oldB, int newC){ if(memoryA.get() == oldB){ memoryA.set(newC); return true; } return false;}

7.2.3 優點

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

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

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

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

7.2.5 典型應用:AtomicInteger

對 i++ 與 i?,通過compareAndSet & 一個死循環實現

而compareAndSet函數內部 = 通過jni操作CAS指令。直到CAS操作成功跳出循環

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. 總結

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

到此這篇關于Java的Synchronized關鍵字學習指南的文章就介紹到這了,更多相關Java的Synchronized關鍵字內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 成都竞价托管_抖音代运营_网站建设_成都SEM外包-成都智网创联网络科技有限公司 | 长沙发电机-湖南发电机-柴油发电机供应厂家-长沙明邦智能科技 | 威廉希尔WilliamHill·足球(中国)体育官方网站 | 长沙发电机-湖南发电机-柴油发电机供应厂家-长沙明邦智能科技 | 集装箱箱号识别_自重载重图像识别_铁路车号自动识别_OCR图像识别 | 深圳展厅设计_企业展馆设计_展厅设计公司_数字展厅设计_深圳百艺堂 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 打孔器,打孔钳厂家【温州新星德牌五金工具】 | 蜂窝块状沸石分子筛-吸附脱硫分子筛-萍乡市捷龙环保科技有限公司 | 单柱拉力机-橡胶冲片机-哑铃裁刀-江都轩宇试验机械厂 | arch电源_SINPRO_开关电源_模块电源_医疗电源-东佑源 | 离子色谱自动进样器-青岛艾力析实验科技有限公司 | 拉力机-万能试验机-材料拉伸试验机-电子拉力机-拉力试验机厂家-冲击试验机-苏州皖仪实验仪器有限公司 | 网站建设-网站制作-网站设计-网站开发定制公司-网站SEO优化推广-咏熠软件 | 西门子伺服电机维修,西门子电源模块维修,西门子驱动模块维修-上海渠利 | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 环压强度试验机-拉链拉力试验机-上海倾技仪器仪表科技有限公司 | 新中天检测有限公司青岛分公司-山东|菏泽|济南|潍坊|泰安防雷检测验收 | 儿童乐园|游乐场|淘气堡招商加盟|室内儿童游乐园配套设备|生产厂家|开心哈乐儿童乐园 | 河南膏药贴牌-膏药代加工-膏药oem厂家-洛阳今世康医药科技有限公司 | 水性绝缘漆_凡立水_绝缘漆树脂_环保绝缘漆-深圳维特利环保材料有限公司 | 消防泵-XBD单级卧式/立式消防泵-上海塑泉泵阀(集团)有限公司 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 房屋质量检测-厂房抗震鉴定-玻璃幕墙检测-房屋安全鉴定机构 | PC阳光板-PC耐力板-阳光板雨棚-耐力板雨棚,厂家定制[优尼科板材] | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 全自动过滤器_反冲洗过滤器_自清洗过滤器_量子除垢环_量子环除垢_量子除垢 - 安士睿(北京)过滤设备有限公司 | 金环宇|金环宇电线|金环宇电缆|金环宇电线电缆|深圳市金环宇电线电缆有限公司|金环宇电缆集团 | 罐体电伴热工程-消防管道电伴热带厂家-山东沃安电气 | 电池挤压试验机-自行车喷淋-车辆碾压试验装置-深圳德迈盛测控设备有限公司 | 高压贴片电容|贴片安规电容|三端滤波器|风华电容代理南京南山 | PCB设计,PCB抄板,电路板打样,PCBA加工-深圳市宏力捷电子有限公司 | 船用烟火信号弹-CCS防汛救生圈-船用救生抛绳器(海威救生设备) | 电销卡_北京电销卡_包月电话卡-豪付网络| 医学模型生产厂家-显微手术模拟训练器-仿真手术模拟训练系统-北京医教科技 | 烟雾净化器-滤筒除尘器-防爆除尘器-除尘器厂家-东莞执信环保科技有限公司 | 无尘烘箱_洁净烤箱_真空无氧烤箱_半导体烤箱_电子防潮柜-深圳市怡和兴机电 | 塑木弯曲试验机_铜带拉伸强度试验机_拉压力测试台-倾技百科 | 诗词大全-古诗名句 - 古诗词赏析 | 智慧旅游_智慧景区_微景通-智慧旅游景区解决方案提供商 | 扬尘监测_扬尘监测系统_带证扬尘监测设备 - 郑州港迪科技有限公司 |