java線程安全問題,CAS

  1. 什麼是線程安全問題
    答:當多個線程同時共享一個全局變量,做寫的時候,可能會受到其他線程的干擾,導致數據有問題,這種現象叫做線程安全問題。做讀的時候,不會產生線程安全的問題。對局部變量不會發生線程安全問題。

  2. 線程如何實現同步:即保證數據的原子性
    解決辦法:
    synchronized–自動鎖
    lock–jdk1.5併發包–手動
    在這裏插入圖片描述
    同步的前提:
    要有兩個線程以上,需要發生同步;
    多個線程想同步,必須要用同一把鎖;
    存在弊端:
    競爭鎖資源的時候,比較消耗資源。

  3. 什麼地方需要加鎖:真正產生共享同一全局變量的時候。

  4. 一個線程使用同步函數,另一個線程是同步代碼快(this鎖)能實現同步嗎?可以

  5. 一個線程使用同步函數,另一個線程是同步代碼塊(非this鎖)能實現同步嗎?不可以

  6. 在方法上加上synchronized是非靜態同步函數,在靜態方法上加上synchronized是靜態同步函數。

  7. 靜態同步函數使用this鎖嗎?不使用

  8. 兩個線程,一個線程使用同步函數,另一個線程使用靜態同步函數能實現同步嗎?
    答:不能,同步函數使用this鎖,靜態同步函數使用當前字節碼文件。

  9. 死鎖的產生:同步中嵌套同步,互相不釋放

  10. 多線程三大特性:
    原子性:獨一無二、一致性,保證線程安全
    可見性:java內存模型
    有序性:join,wait,notify(多線程之間通訊)

  11. 什麼是java內存模型:(屬於)多線程可見性jmm,決定了一個線程與另一個線程是否可見。
    主內存:主要存放共享的全局變量
    私有本地內存:本地線程私有變量

  12. jdk1.5併發包中有原子類例如AtomicInteger,底層採用的是CAS併發原語
    在這裏插入圖片描述

CAS的全稱爲Compare-And-Swap,它是- -條CPU併發原語。
它的功能是判斷內存某個位置的值是否爲預期值,如果是則更改爲新的值,這個過程是原子的
CAS併發原語體現在JAVA語言中就是sun.misc.Unsafe類中的各個方法。調用UnSafe類中的CAS方法,JVM會 幫我們實現出CAS彙編指令。這是一種完全依賴於硬件的功能,通過它實現了原子操作。再次強調,由於CAS是一種系統原語,原語屬於操作系統用語範疇,是由若干條指令組成的,用於完成某個功能的-一個過程,並且原語的執行必須是連續的,在執行過程中不允許被中斷,也就是說CAS是一條CPU的原 子指令,不會造成所謂的數據不一致問題。之所以沒有使用synchronized也是因爲CAS原語是基於硬件的彙編語言底層語言的執行是原子指令,所以能實現原子功能。
CAS缺點:使用到了do-while循環,循環時間長,開銷大
只能保證一個共享變量的原子操作
存在ABA問題
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
13. volatile作用:保證線程之間可見,但不保證原子性

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