1. 程式人生 > >《實戰Java...》讀書筆記2

《實戰Java...》讀書筆記2

10、鎖消除也是一種優化技術,一個例子是在不需要同步的地方使用了執行緒安全的資料結構,比如線上程的區域性變數中使用了Vector,一個執行緒的區域性變數是不能被其他執行緒訪問的,不存在多執行緒問題,虛擬機器檢測到這樣的問題就會將不必要的鎖去除。

11、關於ThreadLocal,ThreadLocal是為了讓每個執行緒都擁有一個物件的副本,多個執行緒之間不存在相互干擾。具體實現上,每個執行緒都持有一個ThreadLocal.ThreadLocalMap物件,這個ThreadLocalMap物件的key是一個ThreadLocal,value是這個ThreadLocal所對應的泛型的一個例項。為什麼要用一個map,可能是因為一個執行緒會有多個ThreadLocal型別的引用,這個map跟HashMap不一樣,Entry是WeakReference<ThreadLocal>的一個子類,然後沒有next域,也就是不是拉鍊法。

    在使用ThreadLocal時,總是先嚐試呼叫get獲取值,如果獲取不到就呼叫set設定值,這兩個方法差不多,以get為例,首先要得到當前執行緒,再得到當前執行緒的ThreadLocalMap,然後從ThreadLocalMap中取值。程式碼如下:

    public T get() {

        Thread t = Thread.currentThread();

        ThreadLocalMap map = getMap(t);

        if (map != null) {

            ThreadLocalMap.Entry e = map

.getEntry(this);

            if (e != null)

                return (T)e.value;

        }

        return setInitialValue();

}

12、關於AtomicInteger,這是使用CAS操作(Compare and Swap)實現的執行緒安全的型別。AtomicInteger可以當做Integer來用,只不過是執行緒安全的就是了,多執行緒之間可以直接共享以及更改AtomicInteger型別,而不用加鎖。下面以incrementAndSet為例分析AtomicInteger的實現。其程式碼如下:

    public final intincrementAndGet() {

        for (;;) {

            int current = get();

            int next = current + 1;

            if (compareAndSet(current, next))

                return next;

        }

}

incrementAndGet方法表示將當前值加1,並返回新值。其中裡面的無限迴圈表示不斷嘗試,直到成功為止。get()表示獲取當前值,compareAndSet(current,next)表示如果AtomicInteger變數的當前值為current則將其改為next,成功返回true,如果compareAndSet方法不成功,則不斷獲取新的當前值,並在當前值上加1,不斷嘗試,直到成功為止。這個方法不錯,簡單有效。現在很多處理器都支援CAS操作。

    和AtomicInteger類似的類還有AtomicLong用來代替long型,AtomicBoolean表示boolean型,AtomicReference表示物件引用。

13、帶有時間戳的物件引用:AtomicStampedReference。《實戰Java高併發程式設計》裡提到了CAS操作的一個侷限性,就是有時候不知道一個物件是否被髮生改動,比如有兩個執行緒A,B,A先讀變數var,發現其值為1,要將其改為2,在A讀var並打算改var的這段時間,B改動了var的值,它將var改成2又改成1,那麼在A看來,var好像並沒有改,仍然將其值設定為2。這個例子是沒有錯的,但有時候物件是否改動會影響行為,比如書中舉的送20元優惠的例子。這個時候AtomicReference就無能無力了,需要使用AtomicStampedReference。

14、不變模式:就是一個物件建立之後就不能改了,內部資料不能改了,不變模式的物件天然具有執行緒安全性,因為大家都不能改嘛。建立一個不變物件需要下面三點:

    1)去掉setter方法以及所有修改自身屬性的方法。

    2)將所有屬性設定為private final,類的修飾符也需要有final,這樣這個類就無法被繼承。

    3)有一個可以建立完整物件的建構函式,不然屬性怎麼初始化。

JDK中不變模式應用非常廣泛,其中最典型的就是java.lang.String類。此外所有的元資料包裝類,都是使用不變模式實現的,比如Boolean,Byte,Character,Double等。

15、《實戰Java高併發程式設計》裡提到了一個Future模式,我們知道有些任務是需要有返回值的,這些任務可以實現Callable<V>介面,並且實現call()方法,而不是實現Runnable介面。我們在將任務提交到執行緒池的時候,(executorService.submit())會返回一個Future<V>物件,可以呼叫這個future.get()來獲取返回值。

    Future模式的核心思想是非同步呼叫。也就是說我們在呼叫future.get()方法之前可以幹一些其他事情,不至於阻塞在future.get()方法上。當然如果其他事情幹完了,還沒有返回結果,還是要阻塞的。

    《實戰Java…》提供了一種實現Future模式的方法,那就是在呼叫submit()的時候立即返回一個代理,這個代理持有真實資料的一個引用,呼叫這個代理的get方法返回的是真實資料(得不到就阻塞)。

16、矩陣平行計算的關鍵是如何劃分矩陣,矩陣劃分的不對就不能執行平行計算。在進行矩陣劃分時,將左邊的矩陣橫著劃分為兩半(橫著畫一條線),將右邊的矩陣豎著劃分為兩半,這樣在進行矩陣乘法時,相互分塊之間互不影響,可以平行計算,利用Fork/Join框架計算矩陣平行計算不錯。

17、這本書還提到了一個高併發分散式框架Akka,好像很值得看一下。

相關推薦

《機器學習實戰讀書筆記2:K-近鄰(kNN)演算法 & 原始碼分析

宣告:文章是讀書筆記,所以必然有大部分內容出自《機器學習實戰》。外加個人的理解,另外修改了部分程式碼,並添加了註釋 1、什麼是K-近鄰演算法? 簡單地說,k-近鄰演算法採用測量不同特徵值之間距離的方法進行分類。不恰當但是形象地可以表述為近朱者赤,近墨者黑

實戰Java...》讀書筆記2

10、鎖消除也是一種優化技術,一個例子是在不需要同步的地方使用了執行緒安全的資料結構,比如線上程的區域性變數中使用了Vector,一個執行緒的區域性變數是不能被其他執行緒訪問的,不存在多執行緒問題,虛擬機器檢測到這樣的問題就會將不必要的鎖去除。 11、關於ThreadLo

java並發編程實戰讀書筆記5--任務執行, Executor框架

調度 生產 頁面 acc 消費者模式 退出 融合 可能 第一篇 6.1 在線程中執行任務 第一步要找出清晰的任務邊界。大多數服務器應用程序都提供了一種自然的任務邊界選擇方式:以獨立的請求為邊界。 -6.6.1 串行地執行任務 最簡單的任務調度策略是在單個線程中串行地執行各項

java並發編程實戰讀書筆記6--取消與關閉

特殊 指令 1.5 搶占 用法 tor wid cto hook 這章的主要內容是關於如何使任務和線程安全,快速,可靠的停止下來。 7.1 任務取消 在Java中沒有一種安全的搶占方式來停止線程,但是可以使用一些協作機制,比如: 讓素數生成器運行1秒後取消(並不會剛好在運

java並發編程實戰讀書筆記8--死鎖,性能與可伸縮性,鎖粒度鎖分解鎖分段

線程 com display 次數 傳遞 pan blog right 影響 第10章 避免活躍性危險 10.1 死鎖 -10.1.1 鎖順序死鎖 最簡單的一種死鎖形式: -10.1.2 動態的鎖順序死鎖 可以通過下面的方法來解決: -10.1.3 在協

《深入理解Java虛擬機》讀書筆記2-class文件結構

改變 image 都是 就是 固定 char 形式 lin ESS class文件結構   Class文件內容可以分為兩種數據類型:無符號數和表。其中無符號數包括u1,u2,u3,u4,分別代表1個字節,2個字節,3個字節和4個字節。無符號數可以表示數字、UTF8編碼的字符

機器學習實戰讀書筆記(2)--決策樹

決策樹 決策樹的一個重要任務是為了資料中所蘊含的知識資訊,因此決策樹可以使用一系列不熟悉的資料集合,並從中提取系列規則,在這些機器根據資料集建立規則時,就是機器學習的過程.專家系統中經常使用決策樹 決策樹的構造 優點:計算複雜度不高,輸出結果易於理解,對中間值缺失不敏

深入理解Java虛擬機器讀書筆記2----垃圾收集器與記憶體分配策略

二 垃圾收集器與記憶體分配策略 1 JVM中哪些記憶體需要回收?     JVM垃圾回收主要關注的是Java堆和方法區這兩個區域;而程式計數器、虛擬機器棧、本地方法棧這3個區域隨執行緒而生,隨執行緒而滅,隨著方法結束或者執行緒結束記憶體自然

Java 併發程式設計實戰讀書筆記之一:可重入內建鎖

每個Java物件都可以用做一個實現同步的鎖,這些鎖被稱為內建鎖或監視器鎖。執行緒在進入同步程式碼塊之前會自動獲取鎖,並且在退出同步程式碼塊時會自動釋放鎖。獲得內建鎖的唯一途徑就是進入由這個鎖保護的同步程式碼塊或方法。 當某個執行緒請求一個由其他執行緒持有的鎖時,發出請求的

深入理解Java虛擬機器讀書筆記(2): 深入理解HotSpot虛擬機器物件

深入理解Java虛擬機器讀書筆記(2): 深入理解HotSpot虛擬機器物件 為了理解虛擬機器中資料的細節,比如如何建立、如何佈局以及如何訪問,必須具體到某一虛擬機器和某一個記憶體區域。此處深入探討HotSpot虛擬機器在Java堆中物件分配、佈局和訪問的全過程。 一、物件的建立

《深入理解java虛擬機器》讀書筆記2(java記憶體區域與OOM)

1.java執行時記憶體劃分 》程式計數器 學過彙編的童鞋都知道程式執行時會記錄當前執行的位置,以便確認接下來執行什麼。這裡的程式計數器就是用來儲存當前執行緒所執行位元組碼的行號指示器,也就是地址,位元組碼指示器通過改變程式計數器的值來指定下一條執行

Java併發程式設計實戰讀書筆記-第5章 基礎構建模組

第五章,基礎構建模組 1,同步容器類。 Vector、HashTable此類的容器是同步容器。但也有一些問題,例如,一個執行緒在使用Vector的size()方法進行迴圈每一個元素的時候,而另一個執行緒對Vector的元素進行刪除時,可能會發生ArrayIn

Java程式設計思想》讀書筆記2.一切都是物件

第2章 一切都是物件 2.1 用引用操縱物件 String s; //引用 String s = "asdf"; //物件 2.2 必須由你建立所有物件 String s = new String("asdf"); 儲存到什麼地方: 1) 暫

Java並發編程實戰讀書筆記1_第三章:對象的共享

相對 執行順序 調整 ava 得到 並發編程 自己 引用 處理 可見性 內存可見性,我們不僅希望防止某個線程正在使用對象狀態而另一個線程在同時修改改狀態,而且希望確保當一個線程修改了對象狀態後,其他線程能夠看到發生的狀態變化。 順序性 在沒有同步的情況下,編譯器、處理器以及

java 學習筆記2 面向對象(上)

awr ges abs nal mage 有效 面向對象 ima col 類和對象 類是某一批對象的抽象,可以把類理解成某種概念。對象是一個具體存在的實體。類和對象是面向對象的核心。 類定義的是多個實例的特征,類不是具體存在,實例才是具體存在。 定義類(class)的語法:

數據結構(嚴蔚敏、吳偉民)——讀書筆記-2、 線性表及其基本運算、順序存儲結構

content pri 線性 時間復雜度 length 將他 ron 個數 p s 第二章 線性表 2.1 線性表及其基本運算 2.2 線性表的順序存儲結構 2.3 線性表的鏈式存儲結構 1、線性表:是n個數據元素的有限序列。

《R實戰讀書筆記

.wang col ott director pan tle outfile sink cto 第一章 R簡單介紹 本章概要 1安裝R 2理解R語言 3執行R程序 本章所介紹的內容概括例如以下。 一個典型的數據分析步驟如圖1所

《Android源代碼設計模式解析與實戰讀書筆記(八)

code androi nal clas 函數 轉發 類和對象 cti comment 第八章、狀態模式 1.定義 狀態模式中的行為是由狀態來決定,不同的狀態下有不同的行為。當一個對象的內在狀態改變時同意改變其行為,這個對象看起來像是改變了其類。

OpenCV3編程入門讀書筆記2-core組件

編程 opencv () -c enc 數組 ont ble 興趣 一、顏色空間縮減 1、概念 如果圖像是3通道,深度為1個字節,則每個像素有256*256*256種可能值,這麽多的可能值會對算法性能造成嚴重影響。利用顏色空間縮減就能解決這個問題,例如將顏色值0~9取為新值

java學習筆記(2)

區別 ner false blog == imp 表達 知識 最大值 java基礎知識: 1:運算符 (1)算術運算符 A:+,-,*,/,%,++,-- B:+的用法 a:加法 b:正號 c:字符串連接符 C:/和%的區別 數據做除