大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

Java多線程編程概述
Java多線程的安全問題
Java多線程同步
Java多線程間的通信
Java線程Lock
Java多線程管理
保障線程安全的設(shè)計(jì)技術(shù)
Java鎖的優(yōu)化及注意事項(xiàng)
Java多線程集合
【Java多線程】單例模式與多線程

Java提高鎖性能的方法

減少鎖持有時(shí)間

對(duì)于使用鎖進(jìn)行并發(fā)控制的應(yīng)用程序來說,如果單個(gè)線程特有鎖的時(shí)間過長(zhǎng),會(huì)導(dǎo)致鎖的競(jìng)爭(zhēng)更加激烈,會(huì)影響系統(tǒng)的性能.在程序中需要盡可能減少線程對(duì)鎖的持有時(shí)間,如下面代碼:

public synchronized void  syncMethod(){
   othercode1();
   mutexMethod();
   othercode();
}

在syncMethod同步方法中,假設(shè)只有mutexMethod()方法是需要同步的, othercode1()方法與othercode2()方法不需要進(jìn)行同步. 如果othercode1與othercode2這兩個(gè)方法需要花費(fèi)較長(zhǎng)的CPU時(shí)間,在并發(fā)量較大的情況下,這種同步方案會(huì)導(dǎo)致等待線程的大量增加. 一個(gè)較好的優(yōu)化方案是,只在必要時(shí)進(jìn)行同步,可以減少鎖的持有時(shí)間,提高系統(tǒng)的吞吐量,如把上面的代碼改為:

public  void  syncMethod(){
   othercode1();
   synchronized (this) {
      mutexMethod();
   }
   othercode();
}

只對(duì)mutexMethod()方法進(jìn)行同步,這種減少鎖持有時(shí)間有助于降低鎖沖突的可能性,提升系統(tǒng)的并發(fā)能力。

減小鎖的粒度

一個(gè)鎖保護(hù)的共享數(shù)據(jù)的數(shù)量大小稱為鎖的粒度. 如果一個(gè)鎖保護(hù)的共享數(shù)據(jù)的數(shù)量大就稱該鎖的粒度粗,否則稱該鎖的粒度細(xì).鎖的粒度過粗會(huì)導(dǎo)致線程在申請(qǐng)鎖時(shí)需要進(jìn)行不必要的等待.減少鎖粒度是一種削弱多線程鎖競(jìng)爭(zhēng)的一種手段,可以提高系統(tǒng)的并發(fā)性。

在JDK7前,java.util.concurrent.ConcurrentHashMap類采用分段鎖協(xié)議,可以提高程序的并發(fā)性。

使用讀寫分離鎖代替獨(dú)占鎖

使用ReadWriteLock讀寫分離鎖可以提高系統(tǒng)性能, 使用讀寫分離鎖也是減小鎖粒度的一種特殊情況. 第二條建議是能分割數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)減小鎖的粒度,那么讀寫鎖是對(duì)系統(tǒng)功能點(diǎn)的分割。

在多數(shù)情況下都允許多個(gè)線程同時(shí)讀,在寫的使用采用獨(dú)占鎖,在讀多寫少的情況下,使用讀寫鎖可以大大提高系統(tǒng)的并發(fā)能力。

鎖分離

將讀寫鎖的思想進(jìn)一步延伸就是鎖分離.讀寫鎖是根據(jù)讀寫操作功能上的不同進(jìn)行了鎖分離.根據(jù)應(yīng)用程序功能的特點(diǎn),也可以對(duì)獨(dú)占鎖進(jìn)行分離.如java.util.concurrent.LinkedBlockingQueue類中take()與put()方法分別從隊(duì)頭取數(shù)據(jù),把數(shù)據(jù)添加到隊(duì)尾. 雖然這兩個(gè)方法都是對(duì)隊(duì)列進(jìn)行修改操作,由于操作的主體是鏈表,take()操作的是鏈表的頭部,put()操作的是鏈表的尾部,兩者并不沖突. 如果采用獨(dú)占鎖的話,這兩個(gè)操作不能同時(shí)并發(fā),在該類中就采用鎖分離,take()取數(shù)據(jù)時(shí)有取鎖, put()添加數(shù)據(jù)時(shí)有自己的添加鎖,這樣take()與put()相互獨(dú)立實(shí)現(xiàn)了并發(fā)。

粗鎖化

為了保證多線程間的有效并發(fā),會(huì)要求每個(gè)線程持有鎖的時(shí)間盡量短.但是凡事都有一個(gè)度,如果對(duì)同一個(gè)鎖不斷的進(jìn)行請(qǐng)求,同步和釋放,也會(huì)消耗系統(tǒng)資源.如:

public void  method1(){
   synchronized( lock ){
      同步代碼塊1
   }
   synchronized( lock ){
      同步代碼塊2
   }
}

JVM在遇到一連串不斷對(duì)同一個(gè)鎖進(jìn)行請(qǐng)求和釋放操作時(shí),會(huì)把所有的鎖整合成對(duì)鎖的一次請(qǐng)求,從而減少對(duì)鎖的請(qǐng)求次數(shù),這個(gè)操作叫鎖的粗化,如上一段代碼會(huì)整合為:

public void  method1(){
  synchronized( lock ){
     同步代碼塊1
     同步代碼塊2
  }
}

在開發(fā)過程中,也應(yīng)該有意識(shí)的在合理的場(chǎng)合進(jìn)行鎖的粗化,尤其在循環(huán)體內(nèi)請(qǐng)求鎖時(shí),如:

for(int i = 0 ; i< 100; i++){
   synchronized(lock){}
}

這種情況下,意味著每次循環(huán)都需要申請(qǐng)鎖和釋放鎖,所以一種更合理的做法就是在循環(huán)外請(qǐng)求一次鎖,如:

synchronized( lock ){
   for(int i = 0 ; i< 100; i++){}
}
全部教程
主站蜘蛛池模板: 成人一级视频 | 亚洲 欧美 国产 中文 | 欧美精品四虎在线观看 | 一级片在线免费看 | 国产精品亚洲专区在线观看 | www.色在线 | 中文字暮文字暮 | 亚洲最大色网站 | 国产精品免费综合一区视频 | 欧美曰韩免费视频一区 | 色偷偷久久一区二区三区 | 亚洲精品成人网 | 九九51精品国产免费看 | 成人日韩欧美 | 99热久久国产这里是精品 | 99精品国产在热久久 | 久久99国产精品久久99无号码 | 日本人的色道www免费一区 | 成年人视频在线免费 | 久久夜色精品国产噜噜小说 | 久久免费资源福利资源站 | 四虎免费入口 | 99最新网址| 欧美 日| 伊人999| 久草香蕉视频在线观看 | 亚洲视频播放 | 日日摸天天摸狠狠摸视频 | 亚洲一欧洲中文字幕在线 | 久久这里只有精品2 | 夜夜狠狠狠狠 | 99精品免费 | 欧美在线观看视频 | 国产精品人成人免费国产 | 久久精品人 | 中文字幕亚洲综合久久202 | 9久热久re爱免费精品视频 | 九九影院理论片 | 亚洲精品国产第一区第二区国 | 亚洲精品一区最新 | 亚洲精品久久久久午夜 |