企業(yè)開展網(wǎng)站建設廣告聯(lián)盟有哪些
你是怎么理解樂觀鎖和悲觀鎖的,具體怎么實現(xiàn)呢?
悲觀鎖認為多個線程訪問同一個共享變量沖突的概率較大, 會在每次訪問共享變量之前都去真正加鎖
樂觀鎖認為多個線程訪問同一個共享變量沖突的概率不大. 并不會真的加鎖, 而是直接嘗試訪問數(shù)據(jù). 在訪問的同時識別當前的數(shù)據(jù)是否出現(xiàn)訪問沖突.
悲觀鎖的實現(xiàn)就是先加鎖(比如借助操作系統(tǒng)提供的 mutex), 獲取到鎖再操作數(shù)據(jù). 獲取不到鎖就等待.
樂觀鎖的實現(xiàn)可以引入一個版本號. 借助版本號識別出當前的數(shù)據(jù)訪問是否沖突.
?
介紹下讀寫鎖?
讀寫鎖就是把讀操作和寫操作分別進行加鎖.
讀鎖和讀鎖之間不互斥.
寫鎖和寫鎖之間互斥.
寫鎖和讀鎖之間互斥.
讀寫鎖最主要用在 "頻繁讀, 不頻繁寫" 的場景中
什么是自旋鎖,為什么要使用自旋鎖策略呢,缺點是什么?
如果獲取鎖失敗, 立即再嘗試獲取鎖, 無限循環(huán), 直到獲取到鎖為止. 第一次獲取鎖失敗, 第二次的嘗
試會在極短的時間內(nèi)到來. 一旦鎖被其他線程釋放, 就能第一時間獲取到鎖.
相比于掛起等待鎖,
優(yōu)點: 沒有放棄 CPU 資源, 一旦鎖被釋放就能第一時間獲取到鎖, 更高效. 在鎖持有時間比較短的場
景下非常有用.
缺點: 如果鎖的持有時間較長, 就會浪費 CPU 資源
?
synchronized 是可重入鎖么?
是可重入鎖.
可重入鎖指的就是連續(xù)兩次加鎖不會導致死鎖.
實現(xiàn)的方式是在鎖中記錄該鎖持有的線程身份, 以及一個計數(shù)器(記錄加鎖次數(shù)). 如果發(fā)現(xiàn)當前加鎖
的線程就是持有鎖的線程, 則直接計數(shù)自增.
?