java併發程式設計的藝術(二)---重排序與volatile、final關鍵字
重排序:是指編譯器和處理器為了優化程式效能而對指令序列進行重新排序的一種手段。
當資料依賴的時候不允許產生重排序,多執行緒有些情況下重排序會影響語義。
volatile 定義的的物件記憶體對多執行緒之間是立馬可見的,他建立了先寫後讀happens-before關係,常用來在多執行緒中進行flag標誌位的判斷,當A執行緒寫入volatile變數時,會立馬重新整理值到主記憶體並且同時通知B執行緒修改訊息,B執行緒中讀取該物件值時會被jvm中的執行緒記憶體標記為無效再去讀取一次。
final 的重排序:
- 在建構函式內對一個 final 域的寫入,與隨後把這個被構造物件的引用賦值給一個引用變數,這兩個操作之間不能重排序。
- 初次讀一個包含 final 域的物件的引用,與隨後初次讀這個 final 域,這兩個操作之間不能重排序。
相關推薦
java併發程式設計的藝術(二)---重排序與volatile、final關鍵字
重排序:是指編譯器和處理器為了優化程式效能而對指令序列進行重新排序的一種手段。 當資料依賴的時候不允許產生重排序,多執行緒有些情況下重排序會影響語義。 volatile 定義的的物件記憶體對多執行緒之間是立馬可見的,他建立了先寫後讀happens-before關係,常用來在多執行緒中進行flag標誌位的判
Java併發——鎖框架(二)重入鎖ReentrantLock
1. 重入鎖 重入鎖,顧名思義,就是支援重進入的鎖,它表示該鎖能夠支援一個執行緒對資源的重複加鎖。重進入是指任意執行緒在獲取到鎖之後能夠再次獲取該鎖而不會被鎖阻塞。兩個關鍵問題: (1)執行緒再次獲取鎖。當一條執行緒持有這個鎖並且呼叫lock()、lockUninterruptibly()或
Java內存模型(二)——重排序
序列 依賴性 種類 如果 禁止 加載 runtime 屬於 style 一、重排序 重排序是指為了提高程序的執行效率,編譯器和處理器常常會對語句的執行順序或者指令的執行順序進行重排。 編譯器優化的重排序:編譯器在不改變單線程程序語義的前提下,可以重新安排語句的執行順序
深入理解JMM(Java內存模型) --(二)重排序
單個 擔心 但是 thread 共享 att 無需 排序 ava [轉載自並發編程網 – ifeve.com 原文鏈接:http://ifeve.com/tag/jmm/] 數據依賴性 如果兩個操作訪問同一個變量,且這兩個操作中有一個為寫操作,此時這兩個操作之間就存
Java 記憶體模型的基礎(二)——重排序
一、資料依賴性 如果兩個操作訪問同一個變數,且兩個操作中有一個為寫操作,此時這兩個操作就存在資料依賴性。資料依賴分為以下三種情況: 名稱 程式碼示例 說 明 寫後讀 a = 1; b =
Java併發程式設計系列(一)避免死鎖
避免死鎖 (1)避免一個執行緒同時獲取多個鎖 (2)避免一個執行緒在鎖內佔用多個資源,儘量保證每個鎖只佔用一個資源 (3)使用定時鎖,使用lock.trylock(timeout)替代內部鎖機制 (4)
深入理解Java記憶體模型(二)——重排序
資料依賴性 如果兩個操作訪問同一個變數,且這兩個操作中有一個為寫操作,此時這兩個操作之間就存在資料依賴性。資料依賴分下列三種類型: 名稱 程式碼示例 說明 寫後讀 a = 1;b = a; 寫一個變數之後,再讀這個位置。 寫後寫 a = 1;a = 2; 寫一個變數之後,再寫這
Java併發——Executor框架(二)
總結看過的資料,方便自己學習。 來源:https://blog.csdn.net/zxm490484080/article/details/80886243 前面學習了Executor框架的組成,Executor和ExecutorService的區別,以及ExecutorSe
淺談Java併發程式設計系列(一)—— 如何保證執行緒安全
執行緒安全類 保證類執行緒安全的措施: 不共享執行緒間的變數; 設定屬性變數為不可變變數; 每個共享的可變變數都使用一個確定的鎖保護; 保證執行緒安全的思路: 通過架構設計 通過
Java併發程式設計基礎(二)
前言 熬過了考試周,終於可以繼續我的部落格分享了。大笑,哈哈,裝個X。 本篇部落格主要記錄的是自己使用執行緒間通訊的過程。 執行緒間的通訊 併發常常伴隨著多執行緒的執行,然後這就會涉及到多個執行緒間的配合工作,即執行緒間的通訊。 Volatil
Java併發程式設計學習(一)——標準Thread
1、雖然System.out.println內部是加了鎖的,但是如果System.out.println(i- -),依然是執行緒不安全的,因為有的JVM,i- -需要三步才能完成。 2、通過interrupt方法停止執行緒 public class Int
高階程式設計師需知的併發程式設計知識(二)
### 說明 本篇是繼上一篇併發程式設計未討論完的內容的續篇。上一篇傳送門: [Java併發程式設計一萬字總結(吐血整理)](https://editor.csdn.net/md/?articleId=104642587) ## 活躍性問題 在上一篇我們討論併發程式設計帶來的風險的時候,說到其中 一個風險就
Java併發程式設計實戰(3)- 互斥鎖
我們在這篇文章中主要討論如何使用互斥鎖來解決併發程式設計中的原子性問題。 [toc] # 概述 併發程式設計中的原子性問題的源頭是執行緒切換,那麼禁止執行緒切換可以解決原子性問題嗎? 這需要分情況討論,在單核CPU的情況下,同一時刻只有一個執行緒執行,禁止CPU中斷,就意味著作業系統不會重新排程執行緒,
Java併發程式設計實戰(4)- 死鎖
在這篇文章中,我們主要討論一下死鎖及其解決辦法。 [toc] # 概述 在上一篇文章中,我們討論瞭如何使用一個互斥鎖去保護多個資源,以銀行賬戶轉賬為例,當時給出的解決方法是基於Class物件建立互斥鎖。 這樣雖然解決了同步的問題,但是能在現實中使用嗎?答案是不可以,尤其是在高併發的情況下,原因是我們使用
Java併發程式設計實戰(5)- 執行緒生命週期
在這篇文章中,我們來聊一下執行緒的生命週期。 [toc] # 概述 執行緒是作業系統中的一個概念,在Java中,它是實現併發程式的主要手段。 Java中的執行緒,本質上就是作業系統中的執行緒。 作業系統中的執行緒有“生老病死”,專業說法就是生命週期,雖然不同的開發語言對於作業系統的執行緒做了不同的封裝
Java基礎—IO小結(二)緩衝流與其它流的使用
一、緩衝流的使用 每個位元組流都有對應的緩衝流: BufferedInputStream / BufferedOutputStream 構造器: 方法摘要與對應節點流類似 使用緩衝流實現檔案複製:實際中也是;其中流的關閉只需要關閉緩衝流,內部巢狀的位元組流
Java記憶體模型FAQ(四)重排序意味著什麼?
譯者:Alex 在很多情況下,訪問一個程式變數(物件例項欄位,類靜態欄位和陣列元素)可能會使用不同的順序執行,而不是程式語義所指定的順序執行。編譯器能夠自由的以優化的名義去改變指令順序。在特定的環境下,處理器可能會次序顛倒的執行指令。資料可能在暫存器,處理器緩衝區和主記憶體中以不同的次序移動
java專案部署總結(二)tomcat安裝與配置Native APR 模式
APR是Apache HTTP伺服器的支援庫,提供了一組對映到下層作業系統的API。通過 tomcat-native 庫,使tomcat執行時通過APR更多的呼叫本地API,達到提升效能的目的。而tomcat-native依賴於三個元件:APR, OPEN
java基礎鞏固系列(二):Integer與int之間的區別
在JDK1.5之後引入了自動裝箱(autoboxing)與自動拆箱(unboxing),這讓很多對java的初學者感到很疑惑,我剛才也是其中一員。 首先,有一些基本的概念需要了解: 1、Ingeter是int的包裝類,int的初值為0,Ingeter的初值為null。 2
Java 多執行緒(二) Thread類與Runnable介面的關係
上一篇文章介紹了利用Thread類和Runnable介面建立執行緒的基本方式,可以繼承Thread類或者實現Runnable介面,並覆寫run方法,來編寫自己想要線上程裡做的事情。那麼繼承Thread類和實現Runnable這兩種方式在JDK裡是如何實現的呢,我們先來看一下