這裏寫的比較亂,也沒有一個好的邏輯。內容也是想到哪寫到哪,主要是因爲最近看很多面試題還有書,把自己覺得是一下小知識點記下來。
大家就那麼一看啊。。。。。。。。。。。。。
非線程安全存在於實例變量中,方法內部的私有變量不存在非線程安全
關鍵字Synchronized取得的都是對象鎖,而不是對一段代碼或者方法的鎖,哪個線程先執行帶Synchronized的方法,哪個線程就持有該對象的鎖。只有共享資源的讀寫才需要同步化,關鍵字Synchronize聲明的方法一定是排隊運行的。
A線程調用Synchronized入方法,所以先獲得對象鎖,其他的線程必須等A線程執行完才能調用其Synchronized方法,但是其他線程可以調用其非Synchronized方法。
Synchronized有鎖重入的功能:一個線程得到一個對象鎖後,再次請求該對象鎖還是可以再次得到的,
也就是說,在Synchronized方法中,還是可以調用本類的其他的Synchronized方法的。
可重入的概念是:自己可以再次獲得自己的鎖
同樣,當存在繼承關係時,子類是完全可以通過吧“可重入鎖“調用父類的同步方法
當一個線程執行的代碼塊出現異常時,其 所持有的鎖會自動釋放
同步不具有繼承性
當一個線程訪問一個對象的同步代碼塊時,其他線程對同一個代碼塊的訪問將被阻止,這說明Synchronized使用的對象監視器只有一個
注意:Synchronized關鍵字加到非static上,是給對象加鎖,放到static上是給class類加鎖。
string具有緩存功能,所以要是一個string對象加鎖之後,兩次訪問的其實會是一個,要是對象就可以
volatile :作用是是變量在多個對象間可見
強制從公共堆棧中取得變量的值,而不是從每個線程私有的數據棧中取。
缺點是:不支持原子性
關鍵字volatile是線程同步的輕量級實現,所以volatile的性能要好。
volatile只能用來修飾變量,Synchronize可以用來修飾方法和方法快。
多線程訪問volatile不會發生阻塞,而Synchronized會出現阻塞。
volatile能保證數據可見性,但不能保證原子性
Synchronized可以保證原子性,也可以間接保證可見性,
多線程安全包含原子性和可見性
使用原子類進行i++操作,AtomicInteger類就是原子類,
原子類就是在沒有鎖的情況下,做到線程安全