Java Concurrency 基礎知識

來源:互聯網
上載者:User

標籤:

1.安全執行緒 
a.無狀態的類是安全執行緒的 
b.所有狀態都具有原子性的類是安全執行緒的 
原子性:即對該類的操作是不被打斷的,即使在多線程的環境下 
如果一個類只有單個狀態,推薦使用jdk中的java.util.concurrent.atomic包AtomicBoolean 
AtomicInteger 
AtomicIntegerArray 
AtomicIntegerFieldUpdater 
AtomicLong 
AtomicLongArray 
AtomicLongFieldUpdater 
AtomicMarkableReference 
AtomicReference 
AtomicReferenceArray 
AtomicReferenceFieldUpdater 
AtomicStampedReference 
這些類作為狀態都具有原子性 
2.Synchronized 
a.如果一個方法用Synchronized關鍵字修飾,則調用該方法所用的鎖,為調用方法的對象的固有鎖(如反射),如果同時帶有Static關鍵字修飾,則使用的鎖為該方法所在的類的固有鎖。 
固有鎖:每個對象都隱性地帶有一個鎖,該鎖為重入鎖(重入鎖將在後文介紹),用於synchronized關鍵字 

3.重入鎖 
關於重入鎖的解釋用書中英文的解釋會更準確:But because intrinsic locks are reentrant, if a thread tries to acquire a lock that it already holds, the request succeeds. 

可能看完上面的還是有點難理解 
舉一個書中的例子: 
看以下代碼 
 
假設不是可重新進入鎖,那會出現一個什麼現象? 
調用super.doSomething()時發現該方法被鎖住了,然後等待,但等待的鎖自己正持有著,也就變成了死結 

重入鎖的實現: 
重入鎖是通過一個count和記錄owner--一個持有該鎖的Thread來實現的。當count值為0,認為這個鎖當前沒被任何線程持有。當 一個線程持有了該鎖了,jvm就會把owner置為該線程,並把count置為1,如果同樣鎖線程再次請求該鎖,那jvm就會把count+1,如果線程 退出同步塊,則count-1,當count為0時,鎖就釋放了。 

4.線程狀態的鎖操作 
對於每一個涉及到多個變數的不變數,所有涉及到的變數都應該用同一個鎖來進行同步 
怎麼理解呢? 
看例子: 
 
在vector中,每個方法都是用synchronized修飾的,但在上面的使用中--如果兩個線程先後進入該語句塊,再輪流執行 vector.contain(element),顯然還是會添加兩次同樣的element到vector中,所以還是不能保證vector的原子性 

5.程式中的代碼是可能被打亂的 
如果沒有進行同步,編譯器,進程,和運行環境將有可能會打亂啟動並執行順序。 
如文中所舉例子: 
 
將有可能出現這樣的狀況:輸出結果為0. 
這是因為執行的順序被打亂了 

6.64位元據的讀或寫是非原子性的 
一般的資料類型,如int,執行 
int a = 1; 
int b = a; 
這些操作都是原子操作,但是像long,double就不是了 
jvm是允許把64位元據的讀和寫分開兩次操作的,每次操作32位。 
因此,有些項目,我們對某些資料的即時性不會太在意,就不會定義該變數為原子變數,但如果是long或者double類型,就要小心了。很有可能某使用者在讀取的時候讀到的是前一個資料的前32位,和後一個資料的後32位 

7.volatile關鍵字 
當一個變數用volatile聲明了,編譯器會放一個notice到該變數的共用區,然後當執行的時候,就不會對這個變數在程式中的執行順序進行 修改。並且volatile不會緩衝在寄存器中,也不會緩衝在別的進程中,因此,讀volatile修飾的變數時總能返回一個最新更新的值。 

使用鎖能同時保證變數的可見度和原子性,但volatile只能保證其可見度。 

什麼時候不適合使用volatile? 
舉一個經典的例子:i++操作,在並發環境下volatile是不能保證其正確性的 

什麼時候可以用volatile? 
* 該變數的值不依賴該變數當前的值,像i++,或者你能保證該變數的更新只在單線程的環境下出現 
* 該變數不和其他的變數一起包含在一個不變數中,如上文的vector 
* 由於其他的原因,該變數不需要使用鎖


Java Concurrency 基礎知識

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.