国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

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

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

在高負(fù)載多線程應(yīng)用中性能是非常重要的。為了達(dá)到更好的性能,開發(fā)者必須意識(shí)到并發(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)識(shí)到這三個(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)識(shí)到結(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)文章:
主站蜘蛛池模板: 久久久久久毛片免费播放 | 中文字幕波多野不卡一区 | 高清一级淫片a级中文字幕 高清一区二区 | 日韩国产欧美成人一区二区影院 | 怡红院精品视频 | 日韩精品欧美激情国产一区 | 91视频18| 欧美人与zoxxxx另类9 | 久久99久久精品免费思思 | 手机看片1024精品日韩 | 国产一区二区成人 | 久久国产精品久久久久久久久久 | 思思久热re6这里有精品 | 国产一级免费视频 | 日本一级在线播放线观看视频 | 欧美一级毛片100部 欧美一级毛片aaaaa | 国产视频久久久 | 精品国产九九 | 波多野结衣3女同在线观看 波多野结衣aⅴ在线 | 91精品人成在线观看 | 久久久精品国产免费观看同学 | 国产精品国产三级国产专播 | 中文字幕二区 | 日韩欧美一区二区在线 | 日韩午夜在线 | 一区二区三区网站在线免费线观看 | 亚洲欧洲国产精品 | 亚洲小视频在线 | 国产v精品成人免费视频400条 | 亚洲精品欧美精品国产精品 | a级毛片在线观看 | 久久久国产高清 | 欧美另类精品 | 国产做国产爱免费视频 | 一本久道综合久久精品 | 久久综合色88| 国产美女动态免费视频 | 欧美日一本| 国产99精品一区二区三区免费 | 综合欧美日韩一区二区三区 | 中日韩欧美一级毛片 |