同步(synchronized)基本概念

同步(synchronization):線程交叉(thread interference)、內存一直性(memory consistency)、同步方法(synchronized method)、內在鎖(Intrinsic Locks)、原子性(atomic access)

線程交叉:如兩個線程分別對一個對象的int a=0;執行a++和a—操作,則可能導致a=1或-1或0。因為a++和a—操作都是非原子的,可以拆解為多個步驟,所以a在加完後,沒把值放回內存之前,a發生減一操作,那麼a的值就會是1或-1.

內存一致性:a線程創建b線程之前執行的操作,對b線程來說是可見的;a線程創建b線程後,執行b.join(),那麼a線程之後的代碼,得到了b線程執行的後果。

同步方法:synchronized加在public之後,代表此方法是同步方法,當一線程訪問某對象的某個同步方法(非靜態)時,給該對象加了鎖,別的線程就無法調用該對象的任一同步方法,但並不影響調用其它非同步方法。

內在鎖:內在鎖即指某個線程從獲取該對象到失去該對象訪問權限的期間。靜態方法的鎖確是能夠影響該類的所有對象。同步代碼塊:可以使多個線程訪問一個對象中的某個同步代碼塊時,只能挨個執行,多個線程可以同時執行同步代碼塊外其他代碼(如同步代碼塊所在方法的非同步代碼)。同步代碼塊有一定應用場景:如類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)

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

同步(synchronized)基本概念


分享到:


相關文章: