1. 程式人生 > >Java高並發程序設計

Java高並發程序設計

活動 指令 一個 notifyall net auto 相互 隊列 告訴

一、並行世界

  摩爾定律的失效,2004年秋季,Intel宣布徹底取消4GHz計劃,CPU向多核心的發展,頂級計算機科學家唐納德丶爾文丶克努斯評價:在我看來,這種現象(並發)或多或少是由於硬件設計者已經無計可施導致的,他們將摩爾定律失效的責任推脫給軟件開發者。

  1、幾個概念

  同步和異步:

  並發與並行:都表示多個任務同時執行,但並發偏重於多個任務交替執行。

  臨界區:即共享的數據

  阻塞和非阻塞:

  死鎖、饑餓和活鎖:死鎖為互不讓行,饑餓為一直拿不到資源,活鎖為一直撞到

  2、並發級別

  由於臨界區的存在,多線程之間的並發必須得到控制。根據控制的並發策略,分為阻塞、無饑餓,無障礙,無鎖,無等待 5種

  

  3、Java語言相關:JMM(Java內存模型)

  JMM中的關鍵技術點都是圍繞著多線程的原子性、可見性和有序性來建立的

    (1)、原子性:操作不可中斷

    (2)、可見性:當一個線程修改了某個共享變量的值時,其他線程是否立即知道這個修改。

    (3)、有序性:程序執行時,可能會進行指令的重排來達到優化效果,但在多線程中,由於線程的相互影響,重新排序的線程會打亂其他的線程的執行結果。

二、Java並行

  1、進程與線程

  進程是計算機中的程序關於某數據集合上的一次運動活動,是系統進行資源分配的基本單位。進程是程序的基本執行實體,進程是線程的容器。

  2、線程的狀態轉換

技術分享圖片

  Thead類方法:start() 開啟線程,run()線程執行實體,sleep() 睡眠線程不會釋放資源,yield() 讓出CPU,join() 等待線程運行結束,suspend() 掛起,resume() 重啟

  Object類方法:wait() 釋放對象監聽器,線程進入阻塞狀態;notify() 隨機喚醒一個,notifyAll() 喚醒所有。wait,notify,notifyAll 要在Synchronize同步塊中出現,因為其也會出現並發問題

  3、volatile

  volatile關鍵字告訴虛擬機要主要不要隨意變動優化目標指令,對JMM中有序性。但通過volatile是無法保證原子性操作的。

三、Java並發包

技術分享圖片

  0、並發集合簡介

    ConcurrentHashMap:高效並發HashMap,線程安全

    CopyOnWriteArrayList:在讀多寫少的場合,這個List性能非常好,遠遠浩宇Vector,都是線程安全

    ConcurrentLinkedQueue:高效並發隊列,使用鏈表實現線程安全

    BlockingQueue:一個JDK內部通過鏈表、數組等實現的阻塞 接口

    ConcurrentSkipListMap:跳表的實現,這是一個Map,使用跳表的數據結構進行快速查找

  1、BlockingQueue

    此接口是一個線程安全存取實例的隊列。使用場景

    BlockingQueue通常用於一個線程生產對象,而另外一個線程消費這些對象的場景。

技術分享圖片

  2、HashMap、HashTable、ConcurrentHashMap對比

  HashMap 線程不安全,HashTable,ConcurrentHashMap線程安全

  ConcurrentHashMap 采用鎖分段技術比HashTable更加高效

四、並行模式與算法

  1、單例模式

  2、不變模式

  3、生產者消費者

  4、Future模式

  。。。。

Java高並發程序設計