Java併發編程的藝術讀書筆記(1)-併發編程的挑戰


title: Java併發編程的藝術讀書筆記(1)-併發編程的挑戰
date: 2017-05-03 23:28:45
tags: ['多線程','併發']
categories: 讀書筆記

1.多線程不必定就比單線程快,由於線程有建立和上下文切換的開銷。

1.1vmstat測試上下文切換次數,Lmbench3測時長

1.2如何減小上下文切換

1.2.1無鎖併發編程:多線程競爭鎖時,會引發上下文切換,因此多線程處理數據時,能夠用一些辦法來避免使用鎖,如將數據的ID取模分段,不一樣的線程處理不一樣段的數據。
1.2.2CAS算法:JDK的Atomic包使用CAS算法來更新數據,而不須要加鎖。
1.2.3使用最少線程:避免建立不須要的線程,好比任務不多,可是建立了不少線程來處理,這樣會形成大量線程處於等待狀態。
1.2.4使用協程:在單線程裏實現多任務的調度,並在單線程裏維持多個任務間的切換。

1.3查看線程信息

1.3.1用jstack命令dump線程信息,看看pid爲31177的進程裏的線程都在作什麼。
sudo -u admin /opt/ifeve/java/bin/jstack 31177 > /home/dump17
1.3.2統計全部線程分別處於什麼狀態
grep java.lang.Thread.State dump17 | awk '{print $2$3$4$5}' | sort | uniq -c

2.死鎖

2.1避免死鎖的幾個常見方法

2.1.1避免一個線程同時獲取多個鎖。
2.1.2避免一個線程在鎖內同時佔用多個資源,儘可能保證每一個鎖只佔用一個資源。
2.1.3嘗試使用定時鎖,使用lock.tryLock(timeout)來替代使用內部鎖機制。
2.1.4對於數據庫鎖,加鎖和解鎖必須在一個數據庫鏈接裏,不然會出現解鎖失敗的狀況。

3.資源限制(硬件,軟件)

相關文章
相關標籤/搜索