在路上

          路上有驚慌,路上有理想

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            28 Posts :: 1 Stories :: 10 Comments :: 0 Trackbacks
          以下只是一些概念


          1.SemaphoreCountDownLatch
           
          Semaphore 可用于控制特定資源請求(線程/操作)數(shù)量
           
          CountDownLatch 在功能上類似于Semaphore。區(qū)別是,Semaphore允許一次一個線程的話,CountDownLatch可以允許多個線程在特定的時間一起執(zhí)行。

          2.CAS操作
            根據(jù)英文直譯其實可以理解其含義,compare and set.

            CAS 操作包含三個操作數(shù) —— 內(nèi)存位置(V)、預期原值(A)和新值(B)。如果內(nèi)存位置的值與預期原值相匹配,那么處理器會自動將該位置值更新為新值。否則,處理器不做任何操作。CAS 認為位置 V 應該包含值 A;如果包含該值,則將 B 放到這個位置;否則,不要更改該位置,只告訴我這個位置現(xiàn)在的值即可通常將 CAS 用于同步的方式是從地址 V 讀取值 A,執(zhí)行多步計算來獲得新值 B,然后使用 CAS 將 V 的值從 A 改為 B。如果 V 處的值尚未同時更改,則 CAS 操作成功。

          3.ABA問題

            因為在更改 V 之前,CAS 主要詢問“V 的值是否仍為 A”,所以在第一次讀取 V 以及對 V 執(zhí)行 CAS 操作之前,如果將值從 A 改為 B,然后再改回 A,會使基于 CAS 的算法混亂。在這種情況下,CAS 操作會成功,但是在一些情況下,結(jié)果可能不是您所預期的。這類問題稱為 ABA 問題

          4.原子操作

             A與B兩個操作。從執(zhí)行A的線程看,當其他線程執(zhí)行B時,要么B全部執(zhí)行完成,要么一點都不執(zhí)行。這樣A與B互為原子操作。要保證數(shù)據(jù)狀態(tài)的一致性,要在單一的原子操作中更新所有相關(guān)聯(lián)的狀態(tài)。

          5.可見性
           
             在單線程環(huán)境下,讀寫操作都在一個線程內(nèi)完成,不存在可見性問題。但是,當讀與寫操作不在同一個線程內(nèi)時,就需要有可見性的要求——即可變的共享變量對所有線程都是可見的。

          6.重排序

              JVM實現(xiàn)中,線程內(nèi)部維持順序化語義。如果程序的最終結(jié)果等同于它在嚴格的順序化環(huán)境下的結(jié)果,那么指令的執(zhí)行順序就可能與代碼的順序不一致。這個過程通過叫做指令的重排序。比如Java存儲模型允許編譯器重排序操作指令,在寄存器中緩存數(shù)值,還允許CPU重排序,并在處理器的緩存中緩存數(shù)值。

             當然,在沒有同步的多線程情況下,編譯器,處理器,運行時安排操作的執(zhí)行順序可能完全出人意料。

          7.內(nèi)部鎖

            每個Java對象都可以隱士的扮演一個用于同步的鎖的角色。比如synchronized(object){},執(zhí)行線程進入synchronized塊 之前自動獲得鎖。無論是正確執(zhí)行或是拋出異常,最終都會釋放該鎖。內(nèi)部鎖是一種互斥鎖(mutex)——至多只有一個線程可以擁有鎖。JDK中有該鎖的實 現(xiàn)。

          8.鎖與內(nèi)存

             鎖不僅僅是關(guān)于同步與互斥,也是關(guān)于內(nèi)存可見性的。為了保證所有線程都能訪問共享變量的最新值,讀和寫的線程必須使用公用的鎖進行同步。

          9.鎖與volatile

             加鎖可以保證可見性與原子性,volatile只能保證可見性。

          10.happen-before法則

            Java存儲模型有一個happens-before原則,就是如果動作B要看到動作A的執(zhí)行結(jié)果(無論A/B是否在同一個線程里面執(zhí)行),那么A/B就需要滿足happens-before關(guān)系。比如一個對象構(gòu)造函數(shù)的結(jié)束happens-before與該對象的finalizer的開始


          參考:https://www.ibm.com/developerworks/cn/java/j-jtp11234/

               http://www.ibm.com/developerworks/cn/java/j-5things5.html

               http://www.aygfsteel.com/xylz/archive/2010/07/03/325168.html

              《Java 并發(fā)編程實踐》

          posted on 2010-12-15 18:18 阮步兵 閱讀(1751) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 桃江县| 玛曲县| 且末县| 凌海市| 吐鲁番市| 京山县| 丹巴县| 固安县| 运城市| 大洼县| 泗洪县| 宁波市| 房产| 三穗县| 青川县| 天柱县| 麻江县| 华容县| 溧水县| 石嘴山市| 凭祥市| 阜宁县| 宜兰市| 武陟县| 北辰区| 黄冈市| 辛集市| 仙居县| 平利县| 河西区| 确山县| 定结县| 苗栗县| 建昌县| 绩溪县| 清远市| 广饶县| 武宁县| 郧西县| 龙游县| 江源县|