Java高並發程序設計


一、並行世界

  摩爾定律的失效,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通常用於一個線程生產對象,而另外一個線程消費這些對象的場景。

BlockingQueue

 

  2、HashMap、HashTable、ConcurrentHashMap對比

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

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

四、並行模式與算法

  1、單例模式

    餓漢模式,缺點是不能控制單例生成時間

    

public class Singleton{
  private Singleton();//私有化構造函數,防止new
  private static Singleton instance = new Singleton();//類加載時創建
  public static Singleton getInstance(){
     return instance;
  }    
}

    懶漢模式,缺點是使用synchronized關鍵字影響多並發性能

public class LazySingleton{
  private LazySingleton();
  private static LazySingleton = null;
  puhblic static synchronized LazySingleton getInstance(){
    if(instance ==null) instance = new LazySingleton();
    return instance;
  }  
}

    綜合兩種模式的實現,使用內部類

public class StaticSingleton{
  private LazySingleton();
  private static class SingletonHolder{
    private static StaticSingleton instance = new StaticSingleton();
  }
  
  public static StaticSingleton getInstance(){
    return SingletonHolder.instance;
  }
 
}

 

  2、不變模式

  3、生產者消費者

  4、Future模式

  。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM