JAVA 併發的基礎筆記

  1. volatile類型:  根據Java Language Specification中的說明, jvm系統中存在一個主內存(Main Memory或Java Heap Memory),Java中所有變量都儲存在主存中,對於所有線程都是共享的。  每條線程都有自己的工作內存(Working Memory),工作內存中保存的是主存中某些變量的拷貝,線程對所有變量的操作都是在工作內存中進行,線程之間無法相互直接訪問,變量傳遞均需要通過主存完成。所以,同一變量的值在工作內存和主存中可能不一致。volatile其實是告訴處理器, 不要將我放入工作內存, 請直接在主存操作我。
  2. synchronized關鍵字是悲觀鎖 也叫獨佔鎖。所謂悲觀鎖就是某一線程獨佔資源,其他線程只能乾等着,這種鎖在高併發中性能很差(還有一種實現鎖的方式是樂觀鎖
    樂觀鎖實際上並不加鎖,當計算遇到衝突或者說前後不一致時會重試 直到成功)
  3. 樂觀鎖的實現方式:CAS compare and swap。中文叫:比較並交換。CAS有3個操作數 內存值V 要跟內存值做比較的值A 和 新值 B。用人話可以說成是:我認爲V的值應該是A,如果是,那麼哥就對了,那我就可將V的值更新爲哥想要的值B,如果不是,那麼哥就錯了(說明數據發生了改變),這時哥不做任何修改,但你告訴我現在V的值是多少,然後哥根據你告訴我的新值,做完運算後再來重複第一步的操作。代碼實現如下:while(true){
    if(V == A){
       V = B;
       return ;
    }else{
       A = V;
    }
    }
  4. 要安全的發佈一個對象,對象的引用及對象的狀態必須同是對其它線程可見。方式可以如下
    :在靜態初始化函數中初始化一個對象引用,將對象的引用保存到volatile類型域或者AtomicReferance中,將對象的引用保存到某個正確構造對象的final類型域中,將對象的引用保存到由鎖保存的域中。
  5. 學習使用隊列,在構建高可用的應用系統時,有界隊列是一種強大的資源管理工具,它能抑制並防止產生過多的工作項(如系統突然大量的對數據庫進行插入或更新操作,這時就應當把所有的操作放入一隊列,按一定的速率來去操作數據庫),使應用程序在負荷過重的情況下變得更加健壯。

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