哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JAVA最好的加鎖方法是什么

汽車玩家 ? 來源:oschina ? 作者:oschina ? 2020-05-03 17:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

關(guān)于synchronized

眾所周知,JAVA中最簡單的加鎖方法是用關(guān)鍵字synchronized,我們可以使用這個關(guān)鍵字將一個方法變成線程安全的,也可以將一個代碼塊變成線程安全的,這樣子我們不需要再擔(dān)心多線程同時執(zhí)行到這段代碼會引發(fā)的并發(fā)問題。同時配合方法wait,notify和notifyall可以很好的實現(xiàn)多線程之間的協(xié)作,比如某個線程因為需要等待一些資源,于是調(diào)用wait方法將自己設(shè)置為waiting狀態(tài),其他線程釋放或生產(chǎn)這個線程需要的資源的時候需要通知這個線程(notify)將其喚醒,或者通知所有等待當(dāng)前資源的線程(notifyall)。

然而當(dāng)功能完成之后我們似乎并不滿足于此,于是我們開始考慮這么做的代價是什么,是否可以做的更好。

先說說這么做(使用synchronized)的代價是什么,當(dāng)多個線程請求臨界資源的時候只能有一個線程得到滿足,那么其他的線程會做什么呢,他們會被阻塞,直到被通知(notify/notifyall)又有資源的時候才被喚醒進(jìn)行再一次的鎖爭用,而后往復(fù)的是又只有一個線程能被得到滿足,其他的線程繼續(xù)進(jìn)入阻塞狀態(tài),而這個時候可能會有不斷的增加爭用線程。性能損耗的關(guān)鍵點在于線程的阻塞操作是由操作系統(tǒng)來完成的,在Linux系統(tǒng)下是由pthread_mutex_lock函數(shù)來完成。線程被阻塞之后便進(jìn)入了內(nèi)核調(diào)度態(tài),這個過程發(fā)生了操作系統(tǒng)將保存用戶態(tài)的上下文進(jìn)入內(nèi)核態(tài),這也就是常說的上下文切換,上下文切換代價大,在于操作系統(tǒng)需要將當(dāng)前線程執(zhí)行上下文內(nèi)容(包括堆棧、寄存器等存儲的內(nèi)容)的保存以便之后線程切換回來時候再進(jìn)行現(xiàn)場恢復(fù)。

上面可以看出使用synchronized的代價是什么了吧,當(dāng)競爭激烈的時候會引起頻繁的操作系統(tǒng)上下文切換,從而影響系統(tǒng)的性能。下面再來講講自旋鎖。

自旋鎖的原理

自旋鎖是對線程阻塞的一種優(yōu)化,他的原理簡單的說就是當(dāng)線程爭用鎖失敗的時候不立即進(jìn)入阻塞狀態(tài),而是再等一會,因為對于執(zhí)行時間短的代碼這一會可能就會釋放鎖,而線程就不需要進(jìn)行一次阻塞與喚醒。等待操作就是讓線程多執(zhí)行幾個空指令,至于等待多久這跟具體的處理器實現(xiàn)有關(guān),也有可能處理器根本不支持自旋鎖,具體實現(xiàn)的時候我們可以設(shè)置一個臨界值,當(dāng)超過了這個臨界值之后我們就不自旋了,就乖乖進(jìn)入阻塞狀態(tài)吧。這種優(yōu)化對于執(zhí)行時間短的代碼是很有效的。synchronized使用自旋鎖的時機(jī)是線程進(jìn)入等待隊列即阻塞的前一步。

關(guān)于偏向鎖

偏向鎖是java6提供的一種功能,主要是對無競爭條件下的對加鎖代碼執(zhí)行的優(yōu)化,得到優(yōu)化的地方是省去了對等待隊列的更新操作。在競爭條件下,獲取鎖失敗的線程會被放入等待隊列,這個隊列的更新操作是通過CAS指令來完成的。對于那么一段本部應(yīng)該被加鎖的代碼被加了鎖,我們認(rèn)為每次執(zhí)行這段被加了鎖的代碼的時候更新等待隊列的操作并不是必要的,而CAS操作會延遲本地代碼的執(zhí)行,因此偏向鎖是用于優(yōu)化這個問題的。

關(guān)于Lock

Lock是JAVA5增加的內(nèi)容,在JCU(java.util.concurrent.locks)包下面,作者是并發(fā)大師Doug Lea。JCU包提供了很多封裝的鎖,包括常用的ReentrantLock和ReadWriteLock。這些所其實都是依賴java.util.concurrent.AbstractQueuedSynchronizer這個類來實現(xiàn)的,這個類有個簡寫的名字叫AQS,對這就是著名的AQS。

關(guān)于Lock,先說說線程獲取Lock鎖的時候會引起哪些事件呢。首先AQS是依賴一個被volatile修飾的int變量來標(biāo)識當(dāng)前鎖的狀態(tài)的,為0的時候代表當(dāng)前鎖不被任何線程擁有,當(dāng)線程拿到這個鎖的時候會通過CAS操作修改state的狀態(tài),那么對于爭用失敗的線程AQS會怎么辦呢,AQS內(nèi)部維護(hù)了一個等待隊列,這個隊列是純JAVA實現(xiàn)的,其實現(xiàn)也是非常巧妙的,多線程在通過CAS來獲取自己在隊列中的位置,同時隊列中的線程狀態(tài)也是阻塞狀態(tài),遇到阻塞就頭疼了,上面已經(jīng)介紹過阻塞會帶來的性能問題。在源碼中我們可以看到的是AQS通過LockSupport(LockSupport底層依賴Unsafe)將線程阻塞,關(guān)于LockSupport我有一篇文章介紹的,其功能是用來代替wait和notity/notifyall的,更好的地方是LockSupport對park方法和unpark方法的調(diào)用沒有先后的限制,而notify/notifyall必須在wait調(diào)用之后調(diào)用。盡管如此,這一切并沒有阻止線程進(jìn)入阻塞狀態(tài),我有點失望。

無鎖時代

講到無鎖,必然是Disruptor并發(fā)框架,Disruptor底層依賴一個RingBuffer來進(jìn)行線程之間的數(shù)據(jù)交換,無鎖在于在并發(fā)條件下,多線程對RingBuffer的讀和寫不會涉及到鎖,然而因為RingBuffer滿或者RingBuffer中沒有可消費內(nèi)容引發(fā)的線程等待,那就要另當(dāng)別論了。簡單幾句介紹下無鎖原理,RingBuffer維護(hù)者可讀和可寫的指針,也叫游標(biāo),它指向生產(chǎn)者或消費者需要寫或讀的位置,而對于指針的更新是由CAS來完成的,這個過程中我們不需要加鎖/解鎖的過程。

后記:

JAVA鎖方面的知識主要是要搞清楚不同的鎖的優(yōu)點與缺點,深入到操作系統(tǒng)層的實現(xiàn)機(jī)制與不同場景中對應(yīng)用的性能影響。本文簡單的擼了一下JAVA鎖從synchronized到無鎖的發(fā)展以及一些鎖的簡單原理,主要是拋磚引玉吧,因為介紹的比較簡單,對于文中提到的知識不知道的同學(xué)可以深入了解,我相信你會很有收獲。有些實現(xiàn)的原理介紹可能就一句話,但是實際實現(xiàn)起來是蠻復(fù)雜的,需要考慮到的東西是我們沒有寫過所不能考慮到的。到這里,如果你的項目中用到了多線程并發(fā),你是否會考慮使用無鎖模型來優(yōu)化你項目中多線程之間的通信呢。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5617

    瀏覽量

    130378
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    3005

    瀏覽量

    116800
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Java并發(fā)編程的“基石”——多線程概念初識

    AI 算力調(diào)度底層:Java 并發(fā)基石與未來技術(shù)融合 當(dāng)我們在屏幕前流暢地與大語言模型對話,或是看著自動駕駛系統(tǒng)瞬間處理海量視覺數(shù)據(jù)時,往往只會驚嘆于 AI 算法的精妙。然而,在這層絢麗的應(yīng)用外衣
    發(fā)表于 04-16 18:50

    Java 開發(fā)者指南:全面對比傳統(tǒng) IDE AI 插件與 Cursor、Windsurf 等 AI 原生 IDE

    AI 正在以前所未有的速度重塑 Java 開發(fā)工作流。本文將為您深度解析 AI 在 Java 開發(fā)中的核心應(yīng)用場景,并全面對比傳統(tǒng) IDE(如 IntelliJ IDEA、VS Code)的 AI
    的頭像 發(fā)表于 03-26 14:36 ?459次閱讀
    <b class='flag-5'>Java</b> 開發(fā)者指南:全面對比傳統(tǒng) IDE AI 插件與 Cursor、Windsurf 等 AI 原生 IDE

    Java 性能“刺客”:隱藏在并發(fā)與抽象層下的 4 大元兇及排查指南

    本文由 JRebel / XRebel 授權(quán)合作伙伴龍智為您深度梳理,剖析了 Java 性能不佳帶來的 6 大業(yè)務(wù)影響,并提出將性能調(diào)優(yōu)“左移(Shift-Left)”至開發(fā)階段的核心策略。
    的頭像 發(fā)表于 03-10 16:20 ?194次閱讀
    <b class='flag-5'>Java</b> 性能“刺客”:隱藏在并發(fā)與抽象層下的 4 大元兇及排查指南

    醫(yī)院隨訪管理系統(tǒng)源碼,三級隨訪系統(tǒng)源碼,Java+Springboot,Vue,Ant-Design+MySQL5

    Java版隨訪系統(tǒng)源碼,醫(yī)院隨訪管理系統(tǒng)源碼,三級隨訪系統(tǒng)源碼,B/S前后端分離架構(gòu),自主版權(quán),落地案例。 技術(shù)框架:Java+Springboot,Vue,Ant-Design+MySQL5 開發(fā)
    的頭像 發(fā)表于 11-08 14:48 ?711次閱讀
    醫(yī)院隨訪管理系統(tǒng)源碼,三級隨訪系統(tǒng)源碼,<b class='flag-5'>Java</b>+Springboot,Vue,Ant-Design+MySQL5

    如何基于開發(fā)板RK3568 Android 11強(qiáng)制所有應(yīng)用橫屏展示

    /ParsedActivityUtils.java文件,定位到parseActivityOrReceiver方法的int screenOrientation = sa.ge
    的頭像 發(fā)表于 11-07 16:07 ?862次閱讀
    如何基于開發(fā)板RK3568 Android 11強(qiáng)制所有應(yīng)用橫屏展示

    Arm Neoverse CPU上大代碼量Java應(yīng)用的性能測試

    Java 是互聯(lián)網(wǎng)領(lǐng)域廣泛使用的編程語言。Java 應(yīng)用的一些特性使其性能表現(xiàn)與提前編譯的原生應(yīng)用(例如 C 程序)大相徑庭。由于 Java 字節(jié)碼無法直接在 CPU 上執(zhí)行,因此通常運(yùn)行時在
    的頭像 發(fā)表于 11-05 11:25 ?913次閱讀
    Arm Neoverse CPU上大代碼量<b class='flag-5'>Java</b>應(yīng)用的性能測試

    Java 25正式發(fā)布,重要特性詳解(附代碼示例):靈活構(gòu)造函數(shù)體、模塊導(dǎo)入聲明、AOT方法分析等

    Java 25現(xiàn)已發(fā)布,更多新特性來了!配合Perforce JRebel,代碼修改即時生效,無需重啟服務(wù),即可實現(xiàn)“改完就看效果”。新特性+快工具,讓你的Java開發(fā)體驗雙倍提升!
    的頭像 發(fā)表于 10-29 13:16 ?1662次閱讀
    <b class='flag-5'>Java</b> 25正式發(fā)布,重要特性詳解(附代碼示例):靈活構(gòu)造函數(shù)體、模塊導(dǎo)入聲明、AOT<b class='flag-5'>方法</b>分析等

    Java效率提升指南:5個Java工具選型建議及Perforce JRebel和XRebel介紹

    企業(yè)級Java環(huán)境越來越復(fù)雜,真正的破局點,可能不在“人”,而在于“工具”。5個實用建議,幫你理清Java工具的選型思路。
    的頭像 發(fā)表于 09-11 13:59 ?1838次閱讀
    <b class='flag-5'>Java</b>效率提升指南:5個<b class='flag-5'>Java</b>工具選型建議及Perforce JRebel和XRebel介紹

    Java 在物聯(lián)網(wǎng)與嵌入式系統(tǒng)中的應(yīng)用前景與挑戰(zhàn)

    引言 隨著物聯(lián)網(wǎng)與嵌入式技術(shù)的快速發(fā)展,設(shè)備端的軟件開發(fā)需求不斷增加。傳統(tǒng)上,嵌入式設(shè)備多使用 C、C++ 進(jìn)行開發(fā),但近年來,Java 逐漸成為物聯(lián)網(wǎng)領(lǐng)域的重要角色。憑借其跨平臺特性、豐富
    的頭像 發(fā)表于 09-04 14:49 ?1126次閱讀

    Perforce JRebel 簡介:即時加載代碼變更,加速Java應(yīng)用開發(fā)

    Perforce JRebel 專為Java開發(fā)提速而生!支持跳過構(gòu)建與重新部署,實時加載代碼變更,支持100+框架,無縫集成主流IDE與應(yīng)用服務(wù)器。
    的頭像 發(fā)表于 08-14 14:35 ?949次閱讀
    Perforce JRebel 簡介:即時加載代碼變更,加速<b class='flag-5'>Java</b>應(yīng)用開發(fā)

    ArkUI-X平臺橋接Bridge說明

    簡介 平臺橋接用于客戶端(ArkUI)和平臺(Android或iOS)之間傳遞消息,即用于ArkUI與平臺雙向數(shù)據(jù)傳遞、ArkUI側(cè)調(diào)用平臺的方法、平臺調(diào)用ArkUI側(cè)的方法。 以Android平臺
    發(fā)表于 06-19 23:12

    EtherCAT運(yùn)動控制卡應(yīng)用開發(fā)教程之Java

    運(yùn)動控制卡的Java開發(fā)及DLL調(diào)用
    的頭像 發(fā)表于 06-13 14:29 ?996次閱讀
    EtherCAT運(yùn)動控制卡應(yīng)用開發(fā)教程之<b class='flag-5'>Java</b>

    ArkUI-X與Android橋接通信之方法回調(diào)

    ) => { console.error(\'error: \' + JSON.stringify(err)); }); 2.在Android側(cè)實現(xiàn)被調(diào)用的方法。 // xxx.java
    發(fā)表于 06-08 22:16

    Java開發(fā)者必備的效率工具——Perforce JRebel是什么?為什么很多Java開發(fā)者在用?

    Perforce JRebel是一款Java開發(fā)效率工具,旨在幫助java開發(fā)人員更快地編寫更好的應(yīng)用程序。JRebel可即時重新加載對代碼的修改,無需重啟或重新部署應(yīng)用程序,就能讓開發(fā)者即時看到代碼更改的效果,從而縮短開發(fā)、調(diào)試和測試周期,大大提升開發(fā)效率。
    的頭像 發(fā)表于 04-27 13:44 ?959次閱讀
    <b class='flag-5'>Java</b>開發(fā)者必備的效率工具——Perforce JRebel是什么?為什么很多<b class='flag-5'>Java</b>開發(fā)者在用?

    Java 到 Go:面向?qū)ο蟮木奕伺c云原生的輕騎兵

    Go 語言在 2009 年被 Google 推出,在創(chuàng)建之初便明確提出了“少即是多(Less is more)”的設(shè)計原則,強(qiáng)調(diào)“以工程效率為核心,用極簡規(guī)則解決復(fù)雜問題”。它與 Java 語言生態(tài)
    的頭像 發(fā)表于 04-25 11:13 ?734次閱讀
    博罗县| 时尚| 胶州市| 揭西县| 岐山县| 辽源市| 德州市| 井研县| 泸西县| 福泉市| 巫溪县| 武城县| 榆树市| 靖宇县| 庄浪县| 巴青县| 大渡口区| 梁平县| 连州市| 平潭县| 南召县| 普兰店市| 望奎县| 临潭县| 保靖县| 榆树市| 丘北县| 珠海市| 杭锦旗| 都匀市| 宁波市| 疏勒县| 沙洋县| 任丘市| 城口县| 和顺县| 万源市| 南和县| 莒南县| 中宁县| 克东县|