1. 程式人生 > >Synchronized、volatile與鎖

Synchronized、volatile與鎖

strong str 基本 高速 不能 bool 表示 堆棧 訪問

時間尚早,今天多寫一點

溫故知新(三)

Synchronized與volatile

Synchronized有以下兩個含義:
一、一次只有一個線程可以執行代碼的受保護部分
二、一個線程更改的數據對於其他線程是可見的

volatile只適合於控制對基本變量(int、boolean等)的單個實例的訪問。當一個變量被聲明為volatile,任何對該變量的寫操作都會繞過高速緩存,直接寫入主內存,而任何對改變量的讀取也都繞過高速緩存,直接取自主內存。這表示所有線程在任何時候看到的volatile變量值都相同。

每個Java對象都有一個相關的鎖,同一時間只能有一個線程持有Java鎖。當線程進入Synchronized代碼塊時,線程會阻塞並等待,直到鎖可用。當線程處於就緒狀態時,並且獲得鎖後,將執行代碼塊。當控制退出受保護的代碼塊,即到達了代碼塊末尾或者拋出沒有在Synchronized塊中捕獲的異常時

,它就會釋放該鎖。

Java鎖可以保護許多代碼塊或方法,每次只有一個線程可以持有鎖。反之,僅僅因為代碼塊有鎖保護並不表示兩個線程不能同時執行該代碼塊。它只表示如果兩個線程正在等待相同的鎖,則它們不能同時執行該代碼。

將方法聲明成Synchronized,這表示在進入方法主體之前,調用者必須獲得鎖。對於普通的Synchronized方法,這個鎖是一個對象,將針對它調用方法。對於靜態的Synchronized方法,這個鎖是與Class對象相關的監控器,在該對象中聲明了方法。

使用this引用作為鎖(Synchronized(this),塊同步),表示該代碼塊將與這個類中的Synchronized方法使用同一個鎖。

訪問基於堆棧的局部變量從來不需要受到保護,因為它們只能被自己所屬的線程訪問。

Synchronized、volatile與鎖