多線程小知識2

這裏寫的比較亂,也沒有一個好的邏輯。內容也是想到哪寫到哪,主要是因爲最近看很多面試題還有書,把自己覺得是一下小知識點記下來。

大家就那麼一看啊。。。。。。。。。。。。。


非線程安全存在於實例變量中,方法內部的私有變量不存在非線程安全

  關鍵字Synchronized取得的都是對象鎖,而不是對一段代碼或者方法的鎖,哪個線程先執行帶Synchronized的方法,哪個線程就持有該對象的鎖。
  只有共享資源的讀寫才需要同步化,關鍵字Synchronize聲明的方法一定是排隊運行的。
  A線程調用Synchronized入方法,所以先獲得對象鎖,其他的線程必須等A線程執行完才能調用其Synchronized方法,但是其他線程可以調用其非Synchronized方法。
  
  Synchronized有鎖重入的功能:一個線程得到一個對象鎖後,再次請求該對象鎖還是可以再次得到的,
  也就是說,在Synchronized方法中,還是可以調用本類的其他的Synchronized方法的。
  可重入的概念是:自己可以再次獲得自己的鎖
  同樣,當存在繼承關係時,子類是完全可以通過吧“可重入鎖“調用父類的同步方法
  當一個線程執行的代碼塊出現異常時,其 所持有的鎖會自動釋放
  
  同步不具有繼承性
  
 當一個線程訪問一個對象的同步代碼塊時,其他線程對同一個代碼塊的訪問將被阻止,這說明Synchronized使用的對象監視器只有一個
 
  注意:Synchronized關鍵字加到非static上,是給對象加鎖,放到static上是給class類加鎖。
  string具有緩存功能,所以要是一個string對象加鎖之後,兩次訪問的其實會是一個,要是對象就可以
  
  volatile :作用是是變量在多個對象間可見
  強制從公共堆棧中取得變量的值,而不是從每個線程私有的數據棧中取。

  缺點是:不支持原子性


  Synchronized關鍵字和Volatile的比較:
  
  關鍵字volatile是線程同步的輕量級實現,所以volatile的性能要好。
  volatile只能用來修飾變量,Synchronize可以用來修飾方法和方法快。
  多線程訪問volatile不會發生阻塞,而Synchronized會出現阻塞。
  
  volatile能保證數據可見性,但不能保證原子性
  Synchronized可以保證原子性,也可以間接保證可見性,
  
  多線程安全包含原子性和可見性
  
  使用原子類進行i++操作,AtomicInteger類就是原子類,
  
  原子類就是在沒有鎖的情況下,做到線程安全
  
發佈了43 篇原創文章 · 獲贊 15 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章