Java 中的各類鎖

鎖的類型 鎖的實現
樂觀鎖 在數據庫中能夠使用version版本號去實現;在Java中是使用CAS(Compare And Swap)算法(CAS算法:是一種無鎖算法,是Java提供的非阻塞原子性操做,CAS經過硬件保證了比較更新的原子性,在JDK中Unsafe提供了一系列的compareAndSwap*方法;CAS有ABA問題,解決辦法:在JDK1.5後加入了AtomicStampedReference方法給每一個變量加入了一個時間戳來避免ABA問題。)來實現,在併發包(java.util.concurrent)中原子類都是使用CAS來實現樂觀鎖的。
悲觀鎖 synchronized關鍵字、Lock的實現類
公平鎖 多個線程同時申請鎖的話,線程會放入一個隊列中,在隊列中第一個進入隊列的線程才能獲取鎖資源,講究的是先到先得。new ReentrantLock(true) 提供了公平鎖的實現。
非公平鎖 new ReentrantLock(false) 提供了非公平鎖的實現。
獨佔鎖(排他鎖) 獨佔鎖就是每次只有一個線程能霸佔這個鎖資源,而其餘線程就只能等待當前獲取鎖資源的線程釋放鎖才能再次獲取鎖;ReentrantLock 就是獨佔鎖,其實準確的說獨佔鎖也是悲觀鎖。
共享鎖 共享鎖其實也是樂觀鎖,它放寬了鎖的策略容許多個線程同時獲取鎖。在併發包中 ReadWriteLock 就是一個典型的共享鎖,它容許一個資源能夠被多個讀操做訪問,或者被一個寫操做訪問,但二者不能同時進行。
自旋鎖 自旋鎖其實就是當一個線程獲取鎖的時候,這個鎖已經被其餘人獲取到了,那麼這個線程不會立馬掛起,反而在不放棄CPU使用權的狀況下會嘗試再次獲取鎖資源,默認次數是10次,能夠在JVM中使用-XX:PreBlockSpin官方說明)來設置次數。若是自旋鎖獲取鎖的時間太長,會形成後面的線程CPU資源耗盡釋放。而且自旋鎖是不公平的。

出處:https://mp.weixin.qq.com/s/G4zfnAQH-PJz8jUREX41OAhtml

相關文章
相關標籤/搜索