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

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

Java并發(fā)編程如何降低鎖粒度并實(shí)現(xiàn)性能優(yōu)化

瀏覽:2日期:2022-08-25 18:09:06

在高負(fù)載多線程應(yīng)用中性能是非常重要的。為了達(dá)到更好的性能,開發(fā)者必須意識到并發(fā)的重要性。當(dāng)我們需要使用并發(fā)時(shí), 常常有一個(gè)資源必須被兩個(gè)或多個(gè)線程共享。

在這種情況下,就存在一個(gè)競爭條件,也就是其中一個(gè)線程可以得到鎖(鎖與特定資源綁定),其他想要得到鎖的線程會(huì)被阻塞。這個(gè)同步機(jī)制的實(shí)現(xiàn)是有代價(jià)的,為了向你提供一個(gè)好用的同步模型,JVM和操作系統(tǒng)都要消耗資源。有三個(gè)最重要的因素使并發(fā)的實(shí)現(xiàn)會(huì)消耗大量資源,它們是:

上下文切換 內(nèi)存同步 阻塞

為了寫出針對同步的優(yōu)化代碼,你必須認(rèn)識到這三個(gè)因素以及如何減少它們。在寫這樣的代碼時(shí)你需要注意很多東西。在本文中,我會(huì)向你介紹一種通過降低鎖粒度的技術(shù)來減少這些因素。讓我們從一個(gè)基本原則開始:不要長時(shí)間持有不必要的鎖。

在獲得鎖之前做完所有需要做的事,只把鎖用在需要同步的資源上,用完之后立即釋放它。我們來看一個(gè)簡單的例子:

public class HelloSync { private Map dictionary = new HashMap(); public synchronized void borringDeveloper(String key, String value) { long startTime = (new java.util.Date()).getTime(); value = value + '_'+startTime; dictionary.put(key, value); System.out.println('I did this in '+ ((new java.util.Date()).getTime() - startTime)+' miliseconds'); }}

在這個(gè)例子中,我們違反了基本原則,因?yàn)槲覀儎?chuàng)建了兩個(gè)Date對象,調(diào)用了System.out.println(),還做了很多次String連接操作,但唯一需要做同步的操作是“dictionary.put(key, value);”。讓我們來修改代碼,把同步方法變成只包含這句的同步塊,得到下面更優(yōu)化的代碼:

public class HelloSync { private Map dictionary = new HashMap(); public void borringDeveloper(String key, String value) { long startTime = (new java.util.Date()).getTime(); value = value + '_'+startTime; synchronized (dictionary) { dictionary.put(key, value); } System.out.println('I did this in '+ ((new java.util.Date()).getTime() - startTime)+' miliseconds'); }}

上面的代碼可以進(jìn)一步優(yōu)化,但這里只想傳達(dá)出這種想法。如果你對如何進(jìn)一步優(yōu)化感興趣,請參考java.util.concurrent.ConcurrentHashMap.

那么,我們怎么降低鎖粒度呢?簡單來說,就是通過盡可能少的請求鎖。基本的想法是,分別用不同的鎖來保護(hù)同一個(gè)類中多個(gè)獨(dú)立的狀態(tài)變量,而不是對整個(gè)類域只使用一個(gè)鎖。我們來看下面這個(gè)我在很多應(yīng)用中見到過的簡單例子:

public class Grocery { private final ArrayList fruits = new ArrayList(); private final ArrayList vegetables = new ArrayList(); public synchronized void addFruit(int index, String fruit) { fruits.add(index, fruit); } public synchronized void removeFruit(int index) { fruits.remove(index); } public synchronized void addVegetable(int index, String vegetable) { vegetables.add(index, vegetable); } public synchronized void removeVegetable(int index) { vegetables.remove(index); }}

雜貨店主可以對他的雜貨鋪中的蔬菜和水果進(jìn)行添加/刪除操作。上面對雜貨鋪的實(shí)現(xiàn),通過基本的Grocery 鎖來保護(hù)fruits和vegetables,因?yàn)橥绞窃诜椒ㄓ蛲瓿傻摹J聦?shí)上,我們可以不使用這個(gè)大范圍的鎖,而是針對每個(gè)資源(fruits和vegetables)分別使用一個(gè)鎖。來看一下改進(jìn)后的代碼:

public class Grocery { private final ArrayList fruits = new ArrayList(); private final ArrayList vegetables = new ArrayList(); public void addFruit(int index, String fruit) { synchronized(fruits) fruits.add(index, fruit); } public void removeFruit(int index) { synchronized(fruits) {fruits.remove(index);} } public void addVegetable(int index, String vegetable) { synchronized(vegetables) vegetables.add(index, vegetable); } public void removeVegetable(int index) { synchronized(vegetables) vegetables.remove(index); }}

在使用了兩個(gè)鎖后(把鎖分離),我們會(huì)發(fā)現(xiàn)比起之前用一個(gè)整體鎖,鎖阻塞的情況更少了。當(dāng)我們把這個(gè)技術(shù)用在有中度鎖爭搶的鎖上時(shí),優(yōu)化提升會(huì)更明顯。如果把該方法應(yīng)用到輕微鎖爭搶的鎖上,改進(jìn)雖然比較小,但還是有效果的。但是如果把它用在有重度鎖爭搶的鎖上時(shí),你必須認(rèn)識到結(jié)果并非總是更好。

請有選擇性的使用這個(gè)技術(shù)。如果你懷疑一個(gè)鎖是重度爭搶鎖請按下面的方法來確認(rèn)是否使用上面的技術(shù):

確認(rèn)你的產(chǎn)品會(huì)有多少爭搶度,將這個(gè)爭搶度乘以三倍或五倍(甚至10倍,如果你想準(zhǔn)備的萬無一失) 基于這個(gè)爭搶度做適當(dāng)?shù)臏y試 比較兩種方案的測試結(jié)果,然后挑選出最合適的.

用于改進(jìn)同步性能的技術(shù)還有很多,但對所有的技術(shù)來說最基本的原則只有一個(gè):不要長時(shí)間持有不必要的鎖。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 耐火浇注料价格-高强高铝-刚玉碳化硅耐磨浇注料厂家【直销】 | 广州云仓代发-昊哥云仓专业电商仓储托管外包代发货服务 | 不锈钢水箱厂家,不锈钢保温水箱-山东桑特供水设备 | 匀胶机旋涂仪-声扫显微镜-工业水浸超声-安赛斯(北京)科技有限公司 | PCB接线端子_栅板式端子_线路板连接器_端子排生产厂家-置恒电气 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 螺杆真空泵_耐腐蚀螺杆真空泵_水环真空泵_真空机组_烟台真空泵-烟台斯凯威真空 | 杭州荣奥家具有限公司-浙江办公家具,杭州办公家具厂 | 北京网站建设|北京网站开发|北京网站设计|高端做网站公司 | 空气能暖气片,暖气片厂家,山东暖气片,临沂暖气片-临沂永超暖通设备有限公司 | 旗杆生产厂家_不锈钢锥形旗杆价格_铝合金电动旗杆-上海锥升金属科技有限公司 | 蓄电池回收,ups电池后备电源回收,铅酸蓄电池回收,机房电源回收-广州益夫铅酸电池回收公司 | 注浆压力变送器-高温熔体传感器-矿用压力传感器|ZHYQ朝辉 | 钢制拖链生产厂家-全封闭钢制拖链-能源钢铝拖链-工程塑料拖链-河北汉洋机械制造有限公司 | 螺旋叶片_螺旋叶片成型机_绞龙叶片_莱州源泽机械制造有限公司 | 浙江上沪阀门有限公司| MES系统-WMS系统-MES定制开发-制造执行MES解决方案-罗浮云计算 | KBX-220倾斜开关|KBW-220P/L跑偏开关|拉绳开关|DHJY-I隔爆打滑开关|溜槽堵塞开关|欠速开关|声光报警器-山东卓信有限公司 | 睿婕轻钢别墅_钢结构别墅_厂家设计施工报价 | 仿古瓦,仿古金属瓦,铝瓦,铜瓦,铝合金瓦-西安东申景观艺术工程有限公司 | 金联宇电缆|广东金联宇电缆厂家_广东金联宇电缆实业有限公司 | 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | 酒水灌装机-白酒灌装机-酒精果酒酱油醋灌装设备_青州惠联灌装机械 | 沉降天平_沉降粒度仪_液体比重仪-上海方瑞仪器有限公司 | 色油机-色母机-失重|称重式混料机-称重机-米重机-拌料机-[东莞同锐机械]精密计量科技制造商 | 氢氧化钙设备_厂家-淄博工贸有限公司 | 福建省教师资格证-福建教师资格证考试网 | 电动球阀_不锈钢电动球阀_电动三通球阀_电动调节球阀_上海湖泉阀门有限公司 | 武汉高温老化房,恒温恒湿试验箱,冷热冲击试验箱-武汉安德信检测设备有限公司 | 东莞爱加真空科技有限公司-进口真空镀膜机|真空镀膜设备|Polycold维修厂家 | 昆明网络公司|云南网络公司|昆明网站建设公司|昆明网页设计|云南网站制作|新媒体运营公司|APP开发|小程序研发|尽在昆明奥远科技有限公司 | 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | 仿真茅草_人造茅草瓦价格_仿真茅草厂家_仿真茅草供应-深圳市科佰工贸有限公司 | 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 南京兰江泵业有限公司-水解酸化池潜水搅拌机-絮凝反应池搅拌机-好氧区潜水推进器 | 新型锤式破碎机_新型圆锥式_新型颚式破碎机_反击式打沙机_锤式制砂机_青州建源机械 | atcc网站,sigma试剂价格,肿瘤细胞现货,人结肠癌细胞株购买-南京科佰生物 | 盐水蒸发器,水洗盐设备,冷凝结晶切片机,转鼓切片机,絮凝剂加药系统-无锡瑞司恩机械有限公司 | 锡膏喷印机-全自动涂覆机厂家-全自动点胶机-视觉点胶机-深圳市博明智控科技有限公司 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 披萨石_披萨盘_电器家电隔热绵加工定制_佛山市南海区西樵南方综合保温材料厂 | 东莞压铸厂_精密压铸_锌合金压铸_铝合金压铸_压铸件加工_东莞祥宇金属制品 |