JAVA併發編程的藝術---第一章:併發編程的挑戰

1.1上下文切換
從人物保存到再加載的過程就是一次上下文切換
1.1.1 多線程一定快嗎
答案是不一定的,當併發執行累加操作不查過百萬次時,速度會比串行執行累加操作要慢。
爲什麼併發執行速度會比串行慢?這是因爲線程有創建和上下文切換的開銷。

可是使用Lmbench3測試上下文切換的時長。
使用vmstat可以測量上下文切換的次數。
1.1.3如何減少上下文切換
無鎖併發編程
CAS算法
使用最少線程
協程:在單線程裏實現多任務的調度,並在單線程裏維持多個任務間的切換。
1.1.4減少上下文切換實戰
通過減少線上大量WAITING的線程,來減少上下文切換的次數。
第一步:使用jstack命令dump線程信息,
第二步:統計所有線程處於什麼狀態
第三步:打開dump文件查看處於WAITING的線程在做什麼,發現大多數線程都處於等待狀態。
第四步:減少JBOSS的工作線程數,找到JBOSS的線程池配置信息,將maxThread降到100.
第五步:重啓JBOSS,在dump線程信息,然後統計WAITING的線程。

1.2死鎖
避免死鎖的幾個方法:
(1)避免一個線程同時獲取多個鎖
(2)避免一個線程在鎖內同時佔用多個資源,儘量保證每個鎖只佔用一個資源。
(3)嘗試使用定時鎖,使用lock.tryLock(timeout)來替代使用內部鎖機制。
(4)對於數據庫鎖,加鎖和解鎖必須在一個數據庫連接裏,否則會出現解鎖失敗的情況。

1.3資源限制的挑戰
(1)資源限制是指在進行併發編程時,程序的執行速度受限於計算機硬件或者計算機軟件資源。
(2)資源限制引發的問題
將串行改成並行,但是由於受到資源限制,仍然在串行執行,這個時候不僅不會加快執行,反而會更慢,因爲增加了上下文的切換。
(3)如何解決資源限制的問題
硬件資源限制,可以考慮使用集羣並行執行程序。
軟件資源限制,可以考慮使用資源池將資源複用。
(4)在資源限制的情況下進行併發編程
根據不同的資源限制調整程序的併發度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章