Java多線程編程 — 鎖優化

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

1240

閱讀目錄

一、盡量不要鎖住方法

二、縮小同步代碼塊,只鎖數據

三、鎖中盡量不要再包含鎖

四、將鎖私有化,在內部管理鎖

五、進行適當的鎖分解

正文

并發環境下進行編程時,需要使用鎖機制來同步多線程間的操作,保證共享資源的互斥訪問。加鎖會帶來性能上的損壞,似乎是眾所周知的事情。然而,加鎖本身不會帶來多少的性能消耗,性能主要是在線程的獲取鎖的過程。【Redis實現的分布式鎖和分布式限流】

如果只有一個線程競爭鎖,此時并不存在多線程競爭的情況,那么JVM會進行優化,那么這時加鎖帶來的性能消耗基本可以忽略。因此,規范加鎖的操作,優化鎖的使用方法,避免不必要的線程競爭,不僅可以提高程序性能,也能避免不規范加鎖可能造成線程死鎖問題,提高程序健壯性。下面闡述幾種鎖優化的思路。

一、盡量不要鎖住方法

在普通成員函數上加鎖時,線程獲得的是該方法所在對象的對象鎖。此時整個對象都會被鎖住。這也意味著,如果這個對象提供的多個同步方法是針對不同業務的,那么由于整個對象被鎖住,一個業務業務在處理時,其他不相關的業務線程也必須wait。下面的例子展示了這種情況:

1240

?

1240


運行程序,可以看到在線程bussa 執行的過程中,bussb是不能夠進入函數 busiB()的,因為此時lockMethod 的對象鎖被線程bussa獲取了。【Git內部原理之Git對象】

二、縮小同步代碼塊,只鎖數據

有時候為了編程方便,有些人會synchnoized很大的一塊代碼,如果這個代碼塊中的某些操作與共享資源并不相關,那么應當把它們放到同步塊外部,避免長時間的持有鎖,造成其他線程一直處于等待狀態。尤其是一些循環操作、同步I/O操作。

不止是在代碼的行數范圍上縮小同步塊,在執行邏輯上,也應該縮小同步塊,例如多加一些條件判斷,符合條件的再進行同步,而不是同步之后再進行條件判斷,盡量減少不必要的進入同步塊的邏輯。

三、鎖中盡量不要再包含鎖

這種情況經常發生,線程在得到了A鎖之后,在同步方法塊中調用了另外對象的同步方法,獲得了第二個鎖,這樣可能導致一個調用堆棧中有多把鎖的請求,多線程情況下可能會出現很復雜、難以分析的異常情況,導致死鎖的發生。下面的代碼顯示了這種情況:【Java 編程中關于異常處理的 10 個最佳實踐】

1240


四、將鎖私有化,在內部管理鎖

把鎖作為一個私有的對象,外部不能拿到這個對象,更安全一些。對象可能被其他線程直接進行加鎖操作,此時線程便持有了該對象的對象鎖,例如下面這種情況:

1240


這種使用方式下,對象a的對象鎖被外部所持有,讓這把鎖在外部多個地方被使用是比較危險的,對代碼的邏輯流程閱讀也造成困擾。一種更好的方式是在類的內部自己管理鎖,外部需要同步方案時,也是通過接口方式來提供同步操作:

1240


五、進行適當的鎖分解

考慮下面這段程序:

1240


在這個例子中,join方法只使用一個同步鎖,來獲取tables中的List對象,然后判斷玩家數量是不是小于9,如果是,就調增加一個玩家。當有成千上萬個List存在tables中時,對tables鎖的競爭將非常激烈。面【試中常問的List去重問題,你都答對了嗎?】

在這里,我們可以考慮進行鎖的分解:快速取出數據之后,對List對象進行加鎖,讓其他線程可快速競爭獲得tables對象鎖:

1240


擴展閱讀

七點建議助您寫出優雅的Java代碼

實戰經驗分析,如何優雅地處理 Java 異常

SpringBoot (六) :如何優雅的使用 mybatis

程序員面試過程中,該怎么判斷該公司好壞

如何在面試中介紹自己的項目經驗

【面試現場】如何在10億數中找出前1000大的數

來源:https://www.cnblogs.com/QG-whz/p/8351298.html

轉載于:https://my.oschina.net/javafirst/blog/3043799

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

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

相關文章

Android Ap 開發 設計模式第六篇:原型模式

Prototype Pattern 名稱由來 不是利用類來產生實例對象,而是從一個對象實例產生出另一個新的對象實例 ,根據被視為原型的對象實例 ,建立起的另一個新的對象實例就稱為原型模式(Ptototype Pattern)。 需求場景 種類過多…

netty實現客戶端服務端心跳重連

前言: 公司的加密機調度系統一直使用的是http請求調度的方式去調度,但是會出現網絡故障導致某個客戶端或者服務端斷線的情況,導致很多請求信息以及回執信息丟失的情況,接著我們拋棄了http的方式,改為Tcp的方式去建立客…

為什么您仍然不應該購買《星球大戰:前線II》

If you’ve been following video game news at all for the last couple of weeks, you’ve probably heard that EA’s Star Wars: Battlefront II is having some teething troubles. EA has backpedaled to avoid more controversy, but we’re here to say: don’t fall f…

web 后臺返回json格式數據的方式(status 406)

1.在類上使用注解 RestController public class HttpComentInterface {} 2.在方法是使用注解 ResponseBody RequestMapping(path "/interface/queryRemote", method RequestMethod.POST) //可以指定請求方式ResponseBody public RemoteCommentResultData queryCo…

OpenStack Juno系列之計算節點搭建

OpenStack Juno系列之計算節點搭建 nova-compute安裝配置 -------------------- apt-get install nova-compute sysfsutils 編輯配置文件 vi /etc/nova/nova.conf [DEFAULT] verbose True rpc_backend rabbit rabbit_host controller rabbit_password RABBIT_PASS auth_str…

quantum_如何從Firefox Quantum刪除Pocket

quantumFirefox Quantum has deep integration with the Pocket read-it-later service, which is now owned by Mozilla. You’ll see a Pocket page action in the address bar, a “View Pocket List” feature in the Library, and recommended articles from Pocket on th…

vue-typescript

教你搭建typescript的vue項目 自尤大神去年9月推出vue對typescript的支持后,一直想開箱嘗試vuets,最近一個新項目準備入手typescript,也遇到了很多坑,下面就一步步來吧!!! 1. 項目創建和初始化 …

Couchbase概述

Couchbase概述 Couchbase概述 Couchbase概述Couchbase最早叫Membase,是由Memcached項目組的一些頭目另立的山頭。2011年與CouchDB合并,正式命名為Couchbase。2013年,作為NoSQL技術初創企業,拿到了2500萬美元的D輪投資。截稿時止&a…

Windows 2012 - Dynamic Access Control 淺析

Windows 2012相對于前幾個版本而已,做出了大量的改進,尤其體現在安全性和虛擬化方面。Dynamic Access Control ( 動態訪問控制)是微軟在文件服務器的訪問控制上的新功能,極大的提高了安全性和靈活性。經過一天的研究學習&#xff…

windows rt_如何在Windows RT上輕松將網站添加到Flash白名單

windows rtMicrosoft’s Surface RT and other Windows RT-based machines include the Flash browser plugin, but it only runs on websites Microsoft has whitelisted. We have covered how you can add any website to the Flash whitelist, but now there’s an easier w…

powershell實現設置程序相關性腳本

公司一直有臺服務器cpu占用很高,分析出是恒生監控程序java占用很高,且三個java程序,僅其中一個很高,要恒生解決,一直未解決,導致每周重啟,我司運維都要手動進行程序相關性設置,給運維…

解決npm 的 shasum check failed for錯誤

使用npm安裝一些包失敗,類似如下報錯情況: C:\Program Files\nodejs>npm update npm npm ERR! Windows_NT 10.0.14393 npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\np…

chromebook刷機_您可以購買的最好的Chromebook,2017年版

chromebook刷機While once considered a novelty item by many tech enthusiasts, Chromebooks have broken out of the “just a browser” mold and become legitimate laptops. They’re full-featured, lightweight machines that can do everything most users need them …

Jmeter JDBC請求-----數據庫讀取數據進行參數化 通過SSH跳板機連接數據庫

前期準備: jdbc驅動:mysql-connector-java-5.1.7-bin.jar Jmeter 要鏈接MySQL數據庫,首選需要下載mysql jdbc驅動包(注:驅動包的版本一定要與你數據庫的版本匹配,驅動版本低于mysql版本有可能會導致連接失敗…

Exchange server 2010 beta安裝部署流程

本文使用了微軟公開發布的exchange server 2010 beta進行部署測試。這篇文檔將用到下列產品 windows server 2008 64bit enterprise AD function at windows server 2008 exchange server 2010 beta ----------該exchange server 2010 beta版本屬于早期版本,目前最新…

08.15《CEP職業發展規劃課》

在12,13號的放假后,14,15號安排了CEP職業發展規劃課,為期兩天的課,內容也是很豐富。 在14號的早上,學習了職場中的基本禮儀、和基本素養的培訓,同時對未來的職業規劃做出了大致的分析。 在14號的下午開始了簡歷寫作的課…

usb 驅動修復_您可以修復物理損壞的USB驅動器嗎?

usb 驅動修復Sometimes accidents happen to a USB drive, and you find yourself in a very bad position when your only copy of an important document is on there. When something like this happens, is it possible to fix a physically broken USB drive? Today’s S…

大白話5分鐘帶你走進人工智能-第二十節邏輯回歸和Softmax多分類問題(5)

大白話5分鐘帶你走進人工智能-第二十節邏輯回歸和Softmax多分類問題(5) 上一節中,我們講解了邏輯回歸的優化,本節的話我們講解邏輯回歸做多分類問題以及傳統的多分類問題,我們用什么手段解決。 先看一個場景,假如我們現在的數據集…

Exchange 2016部署實施案例篇-01.架構設計篇(上)

年前就答應大家要給大家寫一個關于Exchange規劃部署的文章,一直忙到現在也沒有倒出時間來寫這個東西。特別是節后,更是開工不利啊,各種奇葩問題,真心無語了。廢話就不多說了,開始今天的議題。 相信各位對Microsoft Exc…

bzoj 4598: [Sdoi2016]模式字符串

題目描述 給出n個結點的樹結構T&#xff0c;其中每一個結點上有一個字符&#xff0c;這里我們所說的字符只考慮大寫字母A到Z&#xff0c;再給出長度為m的模式串s&#xff0c;其中每一位仍然是A到z的大寫字母。 Alice希望知道&#xff0c;有多少對結點<u&#xff0c;v>滿足…