Java面試題-Java中的鎖


1. 如何實現樂觀鎖(CAS)?如何避免ABA問題?
 答:1)讀取內存值的方式實現了樂觀鎖(比如:SVN系統),方法:第一,比較內存值和期望值;第二,替換內存值為要替換值。
        2)帶參數版本來避免aba問題,在讀取和替換的時候進行判定版本是否一致

2. 讀寫鎖可以用於什么應用場景?
 答: 讀寫鎖可以用於 “多讀少寫” 的場景,讀寫鎖支持多個讀操作並發執行,寫操作只能由一個線程來操作
        ReadWriteLock對向數據結構相對不頻繁地寫入,但是有多個任務要經常讀取這個數據結構的這類情況進行了優化。ReadWriteLock使得你可以同事有多個讀取者,只要它們都不試圖寫入即可。如果寫鎖已經被其他任務持有,那么任何讀取者都不能訪問,直至這個寫鎖被釋放為止。
        ReadWriteLock 對程序心性能的提高受制於如下幾個因素也還有其他等等的因素。
          1)數據被讀取的頻率與被修改的頻率相比較的結果。
          2)讀取和寫入的時間
          3)有多少線程競爭
          4)是否在多處理機器上運行

3. 什么時候應該使用可重入鎖?
 答:重入鎖指的是在某一個線程中可以多次獲得同一把鎖,在線程中多次操作有鎖的方法。

4. 什么場景下可以使用volatile替換synchronized?
 答: 只需要保證共享資源的可見性的時候可以使用volatile替代,synchronized保證可操作的原子性一致性和可見性。volatile適用於新值不依賴於就值的情形。
      volatile是java提供的一種同步手段,只不過它是輕量級的同步,為什么這么說,因為volatile只能保證多線程的內存可見性,不能保證多線 程的執行有序性。而最徹底的同步要保證有序性和可見性,例如synchronized。任何被volatile修飾的變量,都不拷貝副本到工作內存,任何 修改都及時寫在主存。因此對於Valatile修飾的變量的修改,所有線程馬上就能看到,但是volatile不能保證對變量的修改是有序的。volatile存在的意義是,任何線程對某個變量的修改,都會馬上被其他線程讀取到,因為直接操作主存, 沒有線程對工作內存和主存的同步。所以,volatile的使用場景是有限的,在有限的一些情形下可以使用 volatile 變量替代鎖(synchronized)。
       要使 volatile 變量提供理想的線程安全,必須同時滿足下面兩個條件:
               1)對 變量的寫操作不依賴於當前值。
               2)該變量沒有包含在具有其他變量的不變式中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM