《多線程併發》(一)

1.什麼是線程安全

線程安全的概念:當多個線程訪問某一個類的(對象或方法)時,這個類始終都能表現出正確行爲,那麼這個類(對象或方法)就是線程安全的。

2.如果現實線程安全

synchronized :可以在任意對象及方法上加鎖,而這段加鎖的代碼稱爲“互斥區”或者“臨界區”。

  一個線程想要執行synchronized修飾的方法裏面的代碼時,首先是嘗試獲取鎖,如果拿到鎖,執行synchronized代碼體,拿不到時一直嘗試獲得這把鎖,直到拿到爲止,而且是多線程同時去競爭這把鎖,(也就是會有鎖競爭的問題)。

 多個線程多個鎖:

如果在static的方法synchronized修飾 標識是類鎖 獨佔鎖

3.對象鎖的同步和異步

同步:synchronized

同步的概念就是共享,如果不是共享的資源,就沒有必要進行同步的。

異步:asynchronized

異步的概念就獨立,相互之間不受任何制約,類似於ajax 請求。

同步的目的是爲了線程安全,其實對於線程安全來說,需要滿足兩個特性:

原子性(同步)

可見性

4.髒讀

5.synchronized 鎖重入(jdk 1.8 之後性能接近於lock)

關鍵字synchronize擁有鎖重入的功能,

6.volatile 關鍵字

 用於修飾變量在多個線程之間可見性不具備synchronized 關鍵字的原子性,性能比synchronized 強很多,不會造成阻塞,在很多開源的架構裏使用,比如netyy的底層代碼大量使用volatile,一般volatile用於只針對多個線程可見的變量操作,並不能代替synchronized 的同步功能,要實現原子性推薦使用atomic類的系列的對象,支持原子性操作(注意atomci類只保證本身方法的原子性,並不保證多次操作的原子性)

 


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