-
什麼是線程安全問題
答:當多個線程同時共享一個全局變量,做寫的時候,可能會受到其他線程的干擾,導致數據有問題,這種現象叫做線程安全問題。做讀的時候,不會產生線程安全的問題。對局部變量不會發生線程安全問題。 -
線程如何實現同步:即保證數據的原子性
解決辦法:
synchronized–自動鎖
lock–jdk1.5併發包–手動
同步的前提:
要有兩個線程以上,需要發生同步;
多個線程想同步,必須要用同一把鎖;
存在弊端:
競爭鎖資源的時候,比較消耗資源。 -
什麼地方需要加鎖:真正產生共享同一全局變量的時候。
-
一個線程使用同步函數,另一個線程是同步代碼快(this鎖)能實現同步嗎?可以
-
一個線程使用同步函數,另一個線程是同步代碼塊(非this鎖)能實現同步嗎?不可以
-
在方法上加上synchronized是非靜態同步函數,在靜態方法上加上synchronized是靜態同步函數。
-
靜態同步函數使用this鎖嗎?不使用
-
兩個線程,一個線程使用同步函數,另一個線程使用靜態同步函數能實現同步嗎?
答:不能,同步函數使用this鎖,靜態同步函數使用當前字節碼文件。 -
死鎖的產生:同步中嵌套同步,互相不釋放
-
多線程三大特性:
原子性:獨一無二、一致性,保證線程安全
可見性:java內存模型
有序性:join,wait,notify(多線程之間通訊) -
什麼是java內存模型:(屬於)多線程可見性jmm,決定了一個線程與另一個線程是否可見。
主內存:主要存放共享的全局變量
私有本地內存:本地線程私有變量 -
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作用:保證線程之間可見,但不保證原子性