1. 程式人生 > >第二章:Java併發機制的底層實現原理

第二章:Java併發機制的底層實現原理

一、volatile的應用

volatile是輕量級的synchronized,在多執行緒中保證了共享變數的"可見性"。如果volatile變數修飾符使用恰當的話,它比synchronized的使用和執行成本更低,因為它不會引起執行緒上下文的切換和排程

volatile的定義與實現原理

volatile修飾的共享變數,在多核處理器下會引發兩件事情:

  • 將當前處理器快取航的資料寫會到系統記憶體
  • 這個寫回記憶體的操作會使在其他CPU裡快取了該記憶體地址的資料無效

為了提高處理速度,處理器不直接和記憶體進行通訊,而是先將系統記憶體的資料讀到快取後再進行操作,但操作完不知道何時會寫到記憶體。如果對聲明瞭volatile的變數進行寫操作,JVM就會向處理器傳送一條Lock字首的指令,將這個變數所在快取行的資料寫回到系統記憶體。同時其他處理器會將快取中該變數的資料置為無效(快取一致性協議),從記憶體中重新讀取;

volatile的使用優化

舉例:
佇列集合:LinkedTransferQueue 使用追加位元組的方式優化佇列的出隊和入隊效能;

並不是所有的使用volatile的變數都應該追加到64個位元組:
追加位元組,與處理器的快取行處理位元組數相關,有些處理器的快取行是32個位元組寬,就沒有必要增加位元組;
如果共享變數不會被頻繁的寫,鎖機率非常小,也沒有必要通過追加位元組的方式來避免相互鎖定;

二、Synchronized的實現原理和應用

synchronized實現同步的基礎,Java中的每一個物件都可以作為鎖,具體表現為下面三種形式:

  • 對於普通同步方法,鎖時當前實力物件
  • 對於靜態同步方法,鎖時當前類的Class物件
  • 對於同步方法塊,鎖時Synchronized括號裡配置的物件

Java物件頭

synchronized用的鎖是儲存在物件頭中的;如果物件是陣列型別,則虛擬機器用3個位元組寬儲存物件頭,如果物件是非陣列型別,則用2個位元組寬儲存物件頭;

鎖的升級與對比

JavaSE1.6為了減少獲得鎖和釋放鎖帶來的效能消耗,引入了"偏向鎖"和"輕量級鎖";在JavaSE1.6中,鎖一共有4種狀態,級別從低到高依次是:無鎖狀態、偏向鎖、輕量級鎖、重量級鎖,這幾個狀態會隨著競爭情況逐漸升級;
鎖可以升級,但不能降級,目的是為了提高獲得鎖和釋放鎖的效率;

鎖的優缺點與對比

優點 缺點 適用場景
偏向鎖 加鎖和解鎖不需要額外的消耗,和執行非同步方法相比僅存在納秒級的差距 如果執行緒間存在鎖競爭,會帶來額外的鎖撤銷的消耗 適用於只有一個執行緒訪問同步塊場景
輕量級鎖 競爭的執行緒不會阻塞,提高了程式的響應速度 如果始終得不到鎖競爭的執行緒,使用自旋會消耗CPU 追求響應時間,同步塊執行速度非常快
重量級鎖 執行緒競爭不適用自旋,不會消耗CPU 執行緒阻塞,響應時間慢 追求吞吐量,同步塊響應時間長

Java如何實現原子操作

  • 使用CAS實現原子操作
    JDK併發包裡提供了一些使用CAS支援原子操作的類,如:AtomicBoolean,AtomicInteger,AtomicLong,同時提供了有用的工具方法,比如自增、自減;

  • 使用鎖機制實現原子操作

相關推薦

第二Java併發機制底層實現原理

一、volatile的應用 volatile是輕量級的synchronized,在多執行緒中保證了共享變數的"可見性"。如果volatile變數修飾符使用恰當的話,它比synchronized的使用和執行成本更低,因為它不會引起執行緒上下文的切換和排程; vo

Java併發機制底層實現原理-synchronized

章節目錄 synchronized的實現原理與應用 synchronized 重量級鎖 1.6版本之前 synchronized 被稱之為 重量級鎖 1.6版本對 synchronized 進行了優化,主要優化的點在於 減少 獲得鎖和釋放鎖帶 來的效能消耗,為實現這個目的引入了偏向鎖

Java 併發機制底層實現 —— volatile 原理、synchronize 鎖優化機制

> 本書部分摘自《Java 併發程式設計的藝術》 ## 概述 相信大家都很熟悉如何使用 Java 編寫處理併發的程式碼,也知道 Java 程式碼在編譯後變成 Class 位元組碼,位元組碼被類載入器載入到 JVM 裡,JVM 執行位元組碼,最終需要轉化為彙編指令在 CPU 上執行。因此,Java

原始碼閱讀Java併發之synchronized實現原理

執行緒安全是併發程式設計中的重要關注點,應該注意到的是,造成執行緒安全問題的主要誘因有兩點,一是存在共享資料(也稱臨界資源),二是存在多條執行緒共同操作共享資料。因此為了解決這個問題,我們可能需要這樣一個方案,當存在多個執行緒操作共享資料時,需要保證同一時刻有且

Java併發機制底層——synchronized的實現原理

1 引言 在多執行緒併發程式設計中Synchronized一直是元老級角色,很多人都會稱呼它為重量級鎖,但是隨著Java SE1.6對Synchronized進行了各種優化之後,有些情況下它並不那麼重了,本文詳細介紹了Java SE1.6中為了減少獲得鎖和釋放

Java併發機制底層——Volatile的實現原理

引言 在多執行緒併發程式設計中synchronized和Volatile都扮演著重要的角色,Volatile是輕量級的synchronized,它在多處理器開發中保證了共享變數的“可見性”。可見性的意思是當一個執行緒修改一個共享變數時,另外一個執行緒能讀到這個

第二 Java總結

存儲空間 基本類型 code 字節 運行時 void 科學 編程語言 數值 第二章筆記什麽是變量:變量代表一塊內存區域,變量類型不一樣,這一塊內存的大小也不一樣。#在編程語言裏面,你可以通過定義變量,向內存裏添加數據或者修改內存已有的數據。說白了,變量就是代表程序運行時存放

深入理解JVM—第二Java記憶體區域與記憶體溢位異常

1,概述 Java較C、C++,Java可以利用虛擬機器的自動記憶體管理機制,避免繁瑣的記憶體分配與回收。不容易出現記憶體洩漏和記憶體溢位問題。 記憶體洩漏:指程式申請到的記憶體空間不再歸還(無法歸還),可使用完該記憶體空間的程式也不能再訪問該空間(

JAVA併發底層實現

在java的多執行緒程式設計中,我們經常會使用一些關鍵字,如volatile,sychronized,atomic原子操作等等。那麼在更加底層的JVM中,這些關鍵字是怎麼實現其對應的效果的呢? volatile volatile在多執行緒程式設計中,是用於保

深入理解java虛擬機器-第二java記憶體區域與記憶體洩露異常

2.1概述:   java將記憶體的管理(主要是回收工作),交由jvm管理,確實很省事,但是一點jvm因記憶體出現問題,排查起來將會很困難,為了能夠成為獨當一面的大牛呢,自然要了解vm是怎麼去使用記憶體的。 2.2執行時的資料區域   vm會將管理的記憶體劃分為不同的區域,不同的區域間有各自的用途,以及建立和

Java中HashMap底層實現原理(JDK1.8)源碼分析

blank imp dash logs || 屬性 lte das ces 這幾天學習了HashMap的底層實現,但是發現好幾個版本的,代碼不一,而且看了Android包的HashMap和JDK中的HashMap的也不是一樣,原來他們沒有指定JDK版本,很多文章都是舊版本J

深入理解Java併發之synchronized實現原理

關聯文章: 本篇主要是對Java併發中synchronized關鍵字進行較為深入的探索,這些知識點結合博主對synchronized的個人理解以及相關的書籍的講解(在結尾參考資料),如有誤處,歡迎留言。 執行緒安全是併發程式

JAVA】HashMap底層實現原理淺談

                                  HashMap底層實現原理淺談 不論是實習還是正式工作,HashMap的底層實現原理一直是問地頻率最高的一個內容,今天記錄一下自己對HashMap的理解,如有不當之處,還請各位大佬指正。 一、前置名詞解釋

java引數傳遞底層實現原理解析

1.如下程式碼最終輸出為:??? 這裡就要說到java 傳遞引數的兩種方式:值傳遞與引用傳遞. 1.值傳遞:方法呼叫時,實際引數把它的值傳遞給對應的形式引數,方法執行中形式引數值的改變不影響實際參 數的值。 2.引用傳遞:也稱為傳地址。方法呼叫時,實際引數的引用(地

演算法---hash演算法原理(java中HashMap底層實現原理和原始碼解析)

散列表(Hash table,也叫雜湊表),是依據關鍵碼值(Key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表。  比如我們要儲存八十八個資料,我們為他申請了100個

Java中HashMap底層實現原理(JDK1.8)原始碼分析

在JDK1.6,JDK1.7中,HashMap採用位桶+連結串列實現,即使用連結串列處理衝突,同一hash值的連結串列都儲存在一個連結串列裡。但是當位於一個桶中的元素較多,即hash值相等的元素較多時,通過key值依次查詢的效率較低。而JDK1.8中,HashMap採用位桶+

探析Spring AOP(三)Spring AOP的底層實現原理

一、前言   前面第一篇我們講到了AOP的概念和使用,第二篇也講到了 AOP的實現機制,在第一篇,講到了joinpoint,pointcut,aspect,weave等AOP的核心概念,接下來我們詳解分析他們的實現原理!   在動態代理 和 CGLIB 的支

(轉載)Java中HashMap底層實現原理(JDK1.8)原始碼分析

近期在看一些java底層的東西,看到一篇分析hashMap不錯的文章,跟大家分享一下。 在JDK1.6,JDK1.7中,HashMap採用位桶+連結串列實現,即使用連結串列處理衝突,同一hash值的連結串列都儲存在一個連結串列裡。但是當位於一個桶中的元素較多,即hash值

深入理解 Java 併發之 synchronized 實現原理

關聯文章深入理解Java型別資訊(Class物件)與反射機制深入理解Java列舉型別(enum)深入理解Java註解型別(@Annotation)深入理解Java併發之synchronized實現原理本篇主要是對Java併發中synchronized關鍵字進行較為深入的探索,這些知識點結合博主對synchro

java 併發之 synchronized 實現原理

在 java 開發中 synchronized 是使用的最多的工具。 表現形式 在 java 中每個物件都可以作為鎖: 對於普通同步方法,鎖是當前例項物件; 對於靜態同步方法,鎖是當前類的 Class 物件; 對於同步方法快,鎖是 Synchronized 括