最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8新特性之StampedLock_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年06月07日 16:02:59   投稿:mrr  
本文從synchronized、Lock到Java8新增的StampedLock進(jìn)行對(duì)比分析,對(duì)Java8新特性之StampedLock相關(guān)知識(shí)感興趣的朋友一起看看吧

Java8就像一個(gè)寶藏,一個(gè)小的API改進(jìn),也足與寫(xiě)一篇文章,比如同步,一直是多線(xiàn)程并發(fā)編程的一個(gè)老話(huà)題,相信沒(méi)有人喜歡同步的代碼,這會(huì)降低應(yīng)用的吞吐量等性能指標(biāo),最壞的時(shí)候會(huì)掛起死機(jī),但是即使這樣你也沒(méi)得選擇,因?yàn)橐WC信息的正確性。所以本文決定將從synchronized、Lock到Java8新增的StampedLock進(jìn)行對(duì)比分析,相信StampedLock不會(huì)讓大家失望。

synchronized

在java5之前,實(shí)現(xiàn)同步主要是使用synchronized。它是Java語(yǔ)言的關(guān)鍵字,當(dāng)它用來(lái)修飾一個(gè)方法或者一個(gè)代碼塊的時(shí)候,能夠保證在同一時(shí)刻最多只有一個(gè)線(xiàn)程執(zhí)行該段代碼。

有四種不同的同步塊:

1.實(shí)例方法

2.靜態(tài)方法

3.實(shí)例方法中的同步塊

4.靜態(tài)方法中的同步塊

大家對(duì)此應(yīng)該不陌生,所以不多講了,以下是代碼示例

synchronized(this)
// do operation
}

小結(jié):在多線(xiàn)程并發(fā)編程中Synchronized一直是元老級(jí)角色,很多人都會(huì)稱(chēng)呼它為重量級(jí)鎖,但是隨著Java SE1.6對(duì)Synchronized進(jìn)行了各種優(yōu)化之后,性能上也有所提升。

Lock

它是Java 5在java.util.concurrent.locks新增的一個(gè)API。

Lock是一個(gè)接口,核心方法是lock(),unlock(),tryLock(),實(shí)現(xiàn)類(lèi)有ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock;

ReentrantReadWriteLock, ReentrantLock 和synchronized鎖都有相同的內(nèi)存語(yǔ)義。

與synchronized不同的是,Lock完全用Java寫(xiě)成,在java這個(gè)層面是無(wú)關(guān)JVM實(shí)現(xiàn)的。Lock提供更靈活的鎖機(jī)制,很多synchronized 沒(méi)有提供的許多特性,比如鎖投票,定時(shí)鎖等候和中斷鎖等候,但因?yàn)閘ock是通過(guò)代碼實(shí)現(xiàn)的,要保證鎖定一定會(huì)被釋放,就必須將unLock()放到finally{}中

下面是Lock的一個(gè)代碼示例

rwlock.writeLock().lock();
try {
// do operation
} finally {
rwlock.writeLock().unlock();
}

小結(jié):比synchronized更靈活、更具可伸縮性的鎖定機(jī)制,但不管怎么說(shuō)還是synchronized代碼要更容易書(shū)寫(xiě)些

StampedLock

它是java8在java.util.concurrent.locks新增的一個(gè)API。

ReentrantReadWriteLock 在沒(méi)有任何讀寫(xiě)鎖時(shí),才可以取得寫(xiě)入鎖,這可用于實(shí)現(xiàn)了悲觀(guān)讀?。≒essimistic Reading),即如果執(zhí)行中進(jìn)行讀取時(shí),經(jīng)??赡苡辛硪粓?zhí)行要寫(xiě)入的需求,為了保持同步,ReentrantReadWriteLock 的讀取鎖定就可派上用場(chǎng)。

然而,如果讀取執(zhí)行情況很多,寫(xiě)入很少的情況下,使用 ReentrantReadWriteLock 可能會(huì)使寫(xiě)入線(xiàn)程遭遇饑餓(Starvation)問(wèn)題,也就是寫(xiě)入線(xiàn)程吃吃無(wú)法競(jìng)爭(zhēng)到鎖定而一直處于等待狀態(tài)。

StampedLock控制鎖有三種模式(寫(xiě),讀,樂(lè)觀(guān)讀),一個(gè)StampedLock狀態(tài)是由版本和模式兩個(gè)部分組成,鎖獲取方法返回一個(gè)數(shù)字作為票據(jù)stamp,它用相應(yīng)的鎖狀態(tài)表示并控制訪(fǎng)問(wèn),數(shù)字0表示沒(méi)有寫(xiě)鎖被授權(quán)訪(fǎng)問(wèn)。在讀鎖上分為悲觀(guān)鎖和樂(lè)觀(guān)鎖。

所謂的樂(lè)觀(guān)讀模式,也就是若讀的操作很多,寫(xiě)的操作很少的情況下,你可以樂(lè)觀(guān)地認(rèn)為,寫(xiě)入與讀取同時(shí)發(fā)生幾率很少,因此不悲觀(guān)地使用完全的讀取鎖定,程序可以查看讀取資料之后,是否遭到寫(xiě)入執(zhí)行的變更,再采取后續(xù)的措施(重新讀取變更信息,或者拋出異常) ,這一個(gè)小小改進(jìn),可大幅度提高程序的吞吐量??!

下面是java doc提供的StampedLock一個(gè)例子

class Point {
 private double x, y;
 private final StampedLock sl = new StampedLock();
 void move(double deltaX, double deltaY) { // an exclusively locked method
  long stamp = sl.writeLock();
  try {
  x += deltaX;
  y += deltaY;
  } finally {
  sl.unlockWrite(stamp);
  }
 }
 //下面看看樂(lè)觀(guān)讀鎖案例
 double distanceFromOrigin() { // A read-only method
  long stamp = sl.tryOptimisticRead(); //獲得一個(gè)樂(lè)觀(guān)讀鎖
  double currentX = x, currentY = y; //將兩個(gè)字段讀入本地局部變量
  if (!sl.validate(stamp)) { //檢查發(fā)出樂(lè)觀(guān)讀鎖后同時(shí)是否有其他寫(xiě)鎖發(fā)生?
  stamp = sl.readLock(); //如果沒(méi)有,我們?cè)俅潍@得一個(gè)讀悲觀(guān)鎖
  try {
   currentX = x; // 將兩個(gè)字段讀入本地局部變量
   currentY = y; // 將兩個(gè)字段讀入本地局部變量
  } finally {
   sl.unlockRead(stamp);
  }
  }
  return Math.sqrt(currentX * currentX + currentY * currentY);
 }
//下面是悲觀(guān)讀鎖案例
 void moveIfAtOrigin(double newX, double newY) { // upgrade
  // Could instead start with optimistic, not read mode
  long stamp = sl.readLock();
  try {
  while (x == 0.0 && y == 0.0) { //循環(huán),檢查當(dāng)前狀態(tài)是否符合
   long ws = sl.tryConvertToWriteLock(stamp); //將讀鎖轉(zhuǎn)為寫(xiě)鎖
   if (ws != 0L) { //這是確認(rèn)轉(zhuǎn)為寫(xiě)鎖是否成功
   stamp = ws; //如果成功 替換票據(jù)
   x = newX; //進(jìn)行狀態(tài)改變
   y = newY; //進(jìn)行狀態(tài)改變
   break;
   }
   else { //如果不能成功轉(zhuǎn)換為寫(xiě)鎖
   sl.unlockRead(stamp); //我們顯式釋放讀鎖
   stamp = sl.writeLock(); //顯式直接進(jìn)行寫(xiě)鎖 然后再通過(guò)循環(huán)再試
   }
  }
  } finally {
  sl.unlock(stamp); //釋放讀鎖或?qū)戞i
  }
 }
 }

小結(jié):

StampedLock要比ReentrantReadWriteLock更加廉價(jià),也就是消耗比較小。

StampedLock與ReadWriteLock性能對(duì)比

下圖是和ReadWritLock相比,在一個(gè)線(xiàn)程情況下,是讀速度其4倍左右,寫(xiě)是1倍。

下圖是六個(gè)線(xiàn)程情況下,讀性能是其幾十倍,寫(xiě)性能也是近10倍左右:

下圖是吞吐量提高:

總結(jié)

1、synchronized是在JVM層面上實(shí)現(xiàn)的,不但可以通過(guò)一些監(jiān)控工具監(jiān)控synchronized的鎖定,而且在代碼執(zhí)行時(shí)出現(xiàn)異常,JVM會(huì)自動(dòng)釋放鎖定;

2、ReentrantLock、ReentrantReadWriteLock,、StampedLock都是對(duì)象層面的鎖定,要保證鎖定一定會(huì)被釋放,就必須將unLock()放到finally{}中;

3、StampedLock 對(duì)吞吐量有巨大的改進(jìn),特別是在讀線(xiàn)程越來(lái)越多的場(chǎng)景下;

4、StampedLock有一個(gè)復(fù)雜的API,對(duì)于加鎖操作,很容易誤用其他方法;

5、當(dāng)只有少量競(jìng)爭(zhēng)者的時(shí)候,synchronized是一個(gè)很好的通用的鎖實(shí)現(xiàn);

6、當(dāng)線(xiàn)程增長(zhǎng)能夠預(yù)估,ReentrantLock是一個(gè)很好的通用的鎖實(shí)現(xiàn);

相關(guān)文章

  • java中利用List的subList方法實(shí)現(xiàn)對(duì)List分頁(yè)(簡(jiǎn)單易學(xué))

    java中利用List的subList方法實(shí)現(xiàn)對(duì)List分頁(yè)(簡(jiǎn)單易學(xué))

    本篇文章主要介紹了java中l(wèi)ist數(shù)據(jù)拆分為sublist實(shí)現(xiàn)頁(yè)面分頁(yè)的簡(jiǎn)單代碼,具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-11-11
  • Spring AOP + 注解實(shí)現(xiàn)統(tǒng)一注解功能

    Spring AOP + 注解實(shí)現(xiàn)統(tǒng)一注解功能

    本文我們通過(guò)Spring AOP和Java的自定義注解來(lái)實(shí)現(xiàn)日志的插入功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友一起看看吧
    2018-05-05
  • 創(chuàng)建Java線(xiàn)程安全類(lèi)的七種方法

    創(chuàng)建Java線(xiàn)程安全類(lèi)的七種方法

    線(xiàn)程安全是指某個(gè)方法或某段代碼,在多線(xiàn)程中能夠正確的執(zhí)行,不會(huì)出現(xiàn)數(shù)據(jù)不一致或數(shù)據(jù)污染的情況,我們把這樣的程序稱(chēng)之為線(xiàn)程安全的,反之則為非線(xiàn)程安全的,下面這篇文章主要給大家介紹了關(guān)于創(chuàng)建Java線(xiàn)程安全類(lèi)的七種方法,需要的朋友可以參考下
    2022-06-06
  • Java?OpenCV圖像處理之背景切換

    Java?OpenCV圖像處理之背景切換

    這篇文章主要介紹了利用Java?OpenCV實(shí)現(xiàn)圖像背景的切換,文中的示例代碼講解詳細(xì)。對(duì)我們學(xué)習(xí)OpenCV有一定幫助,感興趣的同學(xué)可以了解一下
    2022-01-01
  • Java8對(duì)List排序的方法大全

    Java8對(duì)List排序的方法大全

    這篇文章主要給大家介紹了關(guān)于Java8對(duì)List排序的方法大全,其實(shí)Java針對(duì)數(shù)組和List的排序都有實(shí)現(xiàn),文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Java實(shí)現(xiàn)的簡(jiǎn)單數(shù)字時(shí)鐘功能示例

    Java實(shí)現(xiàn)的簡(jiǎn)單數(shù)字時(shí)鐘功能示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的簡(jiǎn)單數(shù)字時(shí)鐘功能,涉及java日期時(shí)間及JFrame框架圖形界面操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-02-02
  • Mybatis中注解@MapKey的使用詳解

    Mybatis中注解@MapKey的使用詳解

    mybatis的原身是ibatis,現(xiàn)在已經(jīng)脫離了apache基金會(huì)。這篇文章主要介紹了Mybatis中注解@MapKey的使用的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • Java實(shí)現(xiàn)監(jiān)聽(tīng)文件變化的三種方案詳解

    Java實(shí)現(xiàn)監(jiān)聽(tīng)文件變化的三種方案詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)監(jiān)聽(tīng)文件變化的三種方法,每種方案給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • Java多線(xiàn)程 ReentrantReadWriteLock原理及實(shí)例詳解

    Java多線(xiàn)程 ReentrantReadWriteLock原理及實(shí)例詳解

    這篇文章主要介紹了Java多線(xiàn)程 ReentrantReadWriteLock原理及實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java使用EasyExcel進(jìn)行單元格合并的問(wèn)題詳解

    Java使用EasyExcel進(jìn)行單元格合并的問(wèn)題詳解

    項(xiàng)目中需要導(dǎo)出并合并指定的單元格,下面這篇文章主要給大家介紹了關(guān)于java評(píng)論、回復(fù)功能設(shè)計(jì)與實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06

最新評(píng)論

房山区| 紫阳县| 青神县| 思南县| 竹山县| 婺源县| 上饶县| 临清市| 信丰县| 通州市| 广元市| 郎溪县| 灌阳县| 张家港市| 文安县| 独山县| 留坝县| 阳泉市| 延庆县| 万源市| 定州市| 高邑县| 静安区| 罗源县| 马公市| 新巴尔虎左旗| 金阳县| 韶山市| 西昌市| 云梦县| 和林格尔县| 瓮安县| 普洱| 上思县| 京山县| 桂阳县| 若尔盖县| 临江市| 抚州市| 舞阳县| 孝昌县|