首頁 Java java教程 解讀Java8新特性--StampedLock

解讀Java8新特性--StampedLock

Jun 17, 2017 pm 02:15 PM
java8 特性 解讀

本文從synchronized、Lock到Java8新增的StampedLock進行比較分析,對Java8新特性之StampedLock相關知識感興趣的朋友一起看看吧

Java8就像一個寶藏,一個小的API改進,也足與寫一篇文章,例如同步,一直是多線程並發編程的一個老話題,相信沒有人喜歡同步的代碼,這會降低應用的吞吐量等性能指標,最壞的時候會掛起死機,但是即使這樣你也沒得選擇,因為要確保資訊的正確性。所以這篇文章決定將從synchronized、Lock到Java8新增的StampedLock進行比較分析,相信StampedLock不會讓大家失望。

synchronized

在java5之前,實作同步主要是使用synchronized。它是Java語言的關鍵字,當它用來修飾一個方法或一個程式碼區塊的時候,能夠保證在同一時刻最多只有一個執行緒執行該段程式碼。

有四個不同的同步區塊:

1.實例方法

2.靜態方法

3.實例方法中的同步區塊

4.靜態方法中的同步區塊

大家對此應該不陌生,所以不多講了,以下是程式碼範例


synchronized(this)
// do operation
}
登入後複製

小結:在多線程並發編程中Synchronized一直是元老級角色,很多人都會稱呼它為重量級鎖,但是隨著Java SE1.6對Synchronized進行了各種優化之後,性能上也有所提升。

Lock

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

Lock是一個接口,核心方法是lock(),unlock(),tryLock(),實作類別有ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock;

ReentrantReadWriteLock,ReadWriteLock, ReentrantLock 和synchronized鎖都有相同的記憶體語意。

與synchronized不同的是,Lock完全用Java寫成,在java這個層面是無關JVM實現的。 Lock提供更靈活的鎖機制,很多synchronized 沒有提供的許多特性,例如鎖投票,定時鎖等候和中斷鎖等候,但因為lock是透過程式碼實現的,要保證鎖定一定會被釋放,就必須將unLock( )放到finally{}中

下面是Lock的一個程式碼範例


rwlock.writeLock().lock();
try {
// do operation
} finally {
rwlock.writeLock().unlock();
}
登入後複製

小結:比synchronized更靈活、更具可擴展性的鎖定機制,但不管怎麼說還是synchronized程式碼要更容易書寫些

#StampedLock

##它是java8在java.util.concurrent.locks新增的一個API。


ReentrantReadWriteLock 在沒有任何讀寫鎖時,才可以取得寫入鎖,這可用於實現了悲觀讀取(Pessimistic Reading),即如果執行中進行讀取時,經常可能有另一個執行要寫入的需求,為了保持同步,ReentrantReadWriteLock 的讀取鎖定就可派上用場。


然而,如果讀取執行情況很多,寫入很少的情況下,使用ReentrantReadWriteLock 可能會使寫入執行緒遭遇飢餓(Starvation)問題,也就是寫入執行緒吃吃無法競爭到鎖定而一直處於等待狀態。

StampedLock控制鎖有三種模式(寫,讀,樂觀讀),一個StampedLock狀態是由版本和模式兩個部分組成,鎖獲取方法返回一個數字作為票據stamp,它用相應的鎖狀態表示並控制訪問,數字0表示沒有寫鎖被授權訪問。在讀鎖上分為悲觀鎖和樂觀鎖。


所謂的樂觀讀模式,也就是若讀的操作很多,寫的操作很少的情況下,你可以樂觀地認為,寫入與讀取同時發生幾率很少,因此不悲觀地使用完全的讀取鎖定,程式可以查看讀取資料之後,是否遭到寫入執行的變更,再採取後續的措施(重新讀取變更信息,或者

拋出異常) ,這一個小小改進,可大幅度提高程式的吞吐量! !

下面是java doc提供的StampedLock一個例子


#

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);
  }
 }
 //下面看看乐观读锁案例
 double distanceFromOrigin() { // A read-only method
  long stamp = sl.tryOptimisticRead(); //获得一个乐观读锁
  double currentX = x, currentY = y; //将两个字段读入本地局部变量
  if (!sl.validate(stamp)) { //检查发出乐观读锁后同时是否有其他写锁发生?
  stamp = sl.readLock(); //如果没有,我们再次获得一个读悲观锁
  try {
   currentX = x; // 将两个字段读入本地局部变量
   currentY = y; // 将两个字段读入本地局部变量
  } finally {
   sl.unlockRead(stamp);
  }
  }
  return Math.sqrt(currentX * currentX + currentY * currentY);
 }
//下面是悲观读锁案例
 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) { //循环,检查当前状态是否符合
   long ws = sl.tryConvertToWriteLock(stamp); //将读锁转为写锁
   if (ws != 0L) { //这是确认转为写锁是否成功
   stamp = ws; //如果成功 替换票据
   x = newX; //进行状态改变
   y = newY; //进行状态改变
   break;
   }
   else { //如果不能成功转换为写锁
   sl.unlockRead(stamp); //我们显式释放读锁
   stamp = sl.writeLock(); //显式直接进行写锁 然后再通过循环再试
   }
  }
  } finally {
  sl.unlock(stamp); //释放读锁或写锁
  }
 }
 }
登入後複製

小結:

StampedLock要比ReentrantReadWriteLock更廉價,也就是消耗比較小。

StampedLock與ReadWriteLock效能比較

下圖是和ReadWritLock相比,在一個執行緒情況下,是讀速度其4倍左右,寫是1倍。

下圖是六個執行緒情況下,讀取效能是其數十倍,寫入效能也是近10倍左右:

下圖是吞吐量提高:

總結

#1、synchronized是在JVM層面上實現的,不但可以透過一些監控工具監控synchronized的鎖定,而且在程式碼執行時出現異常,JVM會自動釋放鎖定;

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

3、StampedLock 對吞吐量有巨大的改進,特別是在讀取線程越來越多的場景下;

# 4.StampedLock有一個複雜的API,對於加鎖操作,很容易誤用其他方法;

#5、當只有少量競爭者的時候,synchronized是一個很好的通用的鎖定實現;

6、當執行緒成長能夠預估,ReentrantLock是一個很好的通用的鎖定實作;

以上是解讀Java8新特性--StampedLock的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Win11系統下如何顯示檔案後綴?詳細解讀 Win11系統下如何顯示檔案後綴?詳細解讀 Mar 09, 2024 am 08:24 AM

Win11系統下如何顯示檔案後綴?詳細解讀在Windows11作業系統中,檔案後綴是指檔案名稱後面的點及其後面的字符,用來表示檔案的類型。在預設情況下,Windows11系統會隱藏檔案的後綴,這樣在檔案總管中只能看到檔案的名稱而無法直觀地了解檔案的類型。然而,對於某些使用者來說,顯示文件後綴是非常必要的,因為它能幫助他們更好地辨識文件類型以及進行相關操

win7家庭版與win7旗艦版的差異介紹 win7家庭版與win7旗艦版的差異介紹 Jul 12, 2023 pm 08:41 PM

大家都知道win7系統有很多種版本,像是win7旗艦版、win7專業版、win7家用版等,有不少用戶在家庭版和旗艦版之間糾結,不知道選擇哪個版本比較好,所以今天小編來跟大家說說win7家庭餐與win7旗艦版的差別介紹,大家一起來看看。 1.體驗不同家庭普通版使您的日常操作變得更快、更簡單,可以更快、更方便地存取使用最頻繁的程式和文件。家庭高級版讓您享有最佳的娛樂體驗,可以輕鬆欣賞和分享您喜愛的電視節目、照片、影片和音樂。旗艦版集各版本功能大全,具備Windows7家庭高級版的所有娛樂功能與專

電腦中的cookie資料在哪個資料夾?詳細解讀 電腦中的cookie資料在哪個資料夾?詳細解讀 Jan 19, 2024 am 10:19 AM

隨著網路的不斷發展,人們越來越離不開瀏覽器。而在瀏覽器中,大家都會或多或少用到cookie這個東西。然而,很多人並不知道cookie資料在哪個資料夾中,今天就來詳細解讀一下。首先,我們要先了解cookie是什麼。簡單來說,cookie是由瀏覽器儲存的一段文字訊息,用於保存使用者在瀏覽器中的一些個人設定或記錄使用者的歷史操作等等。當使用者再次開啟同一個網站時,c

掌握Spring MVC的關鍵概念:了解這些重要特性 掌握Spring MVC的關鍵概念:了解這些重要特性 Dec 29, 2023 am 09:14 AM

了解SpringMVC的關鍵特性:掌握這些重要的概念,需要具體程式碼範例SpringMVC是一種基於Java的Web應用開發框架,它透過模型-視圖-控制器(MVC)的架構模式來幫助開發人員建立靈活可擴展的Web應用程式。了解和掌握SpringMVC的關鍵特性將使我們能夠更有效地開發和管理我們的網路應用程式。本文將介紹一些SpringMVC的重要概念

Golang中有類似類別的物件導向特性嗎? Golang中有類似類別的物件導向特性嗎? Mar 19, 2024 pm 02:51 PM

在Golang(Go語言)中並沒有傳統意義上的類別的概念,但它提供了一種稱為結構體的資料類型,透過結構體可以實現類似類別的物件導向特性。在本文中,我們將介紹如何使用結構體實現物件導向的特性,並提供具體的程式碼範例。結構體的定義和使用首先,讓我們來看看結構體的定義和使用方式。在Golang中,結構體可以透過type關鍵字定義,然後在需要的地方使用。結構體中可以包含屬

選擇適用的Go版本,依需求和特性 選擇適用的Go版本,依需求和特性 Jan 20, 2024 am 09:28 AM

隨著網路的快速發展,程式語言也不斷演化和更新。其中,Go語言作為一種開源的程式語言,在近年來備受關注。 Go語言的設計目標是簡單、有效率、安全且易於開發和部署。它具有高並發、快速編譯和記憶體安全等特性,讓它在Web開發、雲端運算和大數據等領域中有著廣泛的運用。然而,目前Go語言也有不同的版本可供選擇。在選擇合適的Go語言版本時,我們需要考慮需求和特性兩個面向。首

Linux Bashrc是什麼?詳細解讀 Linux Bashrc是什麼?詳細解讀 Mar 20, 2024 pm 09:18 PM

LinuxBashrc是Linux系統中的一個設定文件,用於設定使用者的Bash(BourneAgainShell)環境。 Bashrc檔案儲存了使用者登入時所需的環境變數、啟動腳本等訊息,可以客製化使用者的Shell環境。在Linux系統中,每個使用者都有一個對應的Bashrc文件,位於使用者的家目錄下的隱藏資料夾中。 Bashrc檔案的作用主要有以下幾點:設定環

Crypto GPT是什麼?為什麼說3EX的Crypto GPT是幣圈新入口 Crypto GPT是什麼?為什麼說3EX的Crypto GPT是幣圈新入口 Jul 16, 2024 pm 04:51 PM

CryptoGPT是什麼?為什麼說3EX的CryptoGPT是幣圈新入口? 7月5日訊息,3EXAI交易平台正式推出CryptoGPT,這是一個基於AI技術和大數據的創新項目,旨在為全球加密投資者提供全面、智慧的資訊查詢和AI投資建議。 CryptoGPT已收錄CoinMarketCap排名前200的代幣和上百個優質項目方信息,併計劃持續擴展​​。透過CryptoGPT,用戶可免費取得詳盡的交易諮詢報告和AI投資建議,實現資訊諮詢服務到智慧策略創建及自動執行交易的全端式閉環。目前,該服務已免費開放。有需

See all articles