同步(synchronized)基本概念

  1. 同步(synchronization):線程交叉(thread interference)、內存一直性(memory consistency)、同步方法(synchronized method)、內在鎖(Intrinsic Locks)、原子性(atomic access)
  2. 線程交叉:如兩個線程分別對一個對象的int a=0;執行a++和a—操作,則可能導致a=1或-1或0。因爲a++和a—操作都是非原子的,可以拆解爲多個步驟,所以a在加完後,沒把值放回內存之前,a發生減一操作,那麼a的值就會是1或-1.
  3. 內存一致性:a線程創建b線程之前執行的操作,對b線程來說是可見的;a線程創建b線程後,執行b.join(),那麼a線程之後的代碼,得到了b線程執行的後果。
  4. 同步方法:synchronized加在public之後,代表此方法是同步方法,當一線程訪問某對象的某個同步方法(非靜態)時,給該對象加了鎖,別的線程就無法調用該對象的任一同步方法,但並不影響調用其它非同步方法。
  5. 內在鎖:內在鎖即指某個線程從獲取該對象到失去該對象訪問權限的期間。靜態方法的鎖確是能夠影響該類的所有對象。同步代碼塊:可以使多個線程訪問一個對象中的某個同步代碼塊時,只能挨個執行,多個線程可以同時執行同步代碼塊外其他代碼(如同步代碼塊所在方法的非同步代碼)。同步代碼塊有一定應用場景:如類A中有兩個對象成員變量B,C,2個線程可以同時一個訪問B、一個訪問C,但是不能同時2個都訪問B或2個都訪問C。那麼可以利用如下代碼實現:

    class A{

               B b = new B();

               C c = new C();

               public void increaseB(){

                        synchronized(b){

                                 …}

                }

                public void increaseC(){

                        synchronized(c){

                                 …

                        }

                 }

    }

    如此以來訪問b時(執行increaseB),鎖住的是b對象,那麼並不影響訪問c(執行increaseC)

  6. 原子性:讀寫任一基本類型都是原子操作(long和double除外);讀寫任一volatile修飾的基本類型都是原子操作

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