Java實(shí)現(xiàn)自定義自旋鎖代碼實(shí)例
自旋鎖
1.空輪詢實(shí)現(xiàn)
- 此處主要利用while空輪詢以及原子包的CAS
package com.gy.spinlock; import java.util.concurrent.atomic.AtomicInteger; /** * 利用空輪詢實(shí)現(xiàn) */ public class SpinLock01 { private AtomicInteger state = new AtomicInteger(0); public void lock() { while (!state.compareAndSet(0, 1)){ } } public void unLock() { state.compareAndSet(1, 0); } }
2. sleep提升性能
- 第一種實(shí)現(xiàn)問(wèn)題比較明顯,當(dāng)我們的線程沒(méi)有獲得鎖之前都是空輪詢,此時(shí)我們可以讓沒(méi)有獲取鎖的線程停止
package com.gy.spinlock; import java.util.concurrent.atomic.AtomicInteger; /** * 利用空輪詢實(shí)現(xiàn) */ public class SpinLock01 { private AtomicInteger state = new AtomicInteger(0); public void lock() { while (!state.compareAndSet(0, 1)){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } public void unLock() { state.compareAndSet(1, 0); } }
3. Unsafe提升性能
- 第二種方式雖然能讓程序暫停但是sleep的時(shí)間是不好控制的,那么這里有沒(méi)有一種方式可以直接讓程序停止知道unlock的時(shí)候才被喚醒
- park方法和unPark方法就能實(shí)現(xiàn)這樣的功能
- 此處unLock處不一定就是unPark的線程獲得鎖
- 此處加鎖解鎖是否同一線程并未處理,處理方式只需要記錄加鎖線程解鎖時(shí)判斷即可
package com.gy.spinlock; import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.LockSupport; /** * 利用空輪詢實(shí)現(xiàn) */ public class SpinLock01 { private AtomicInteger state = new AtomicInteger(0); private Queue<Thread> queue = new LinkedList(); public void lock() { while (!state.compareAndSet(0, 1)){ queue.add(Thread.currentThread()); LockSupport.park(); } } public void unLock() { state.compareAndSet(1, 0); LockSupport.unpark(queue.poll()); } }
到此這篇關(guān)于Java實(shí)現(xiàn)自定義自旋鎖代碼實(shí)例的文章就介紹到這了,更多相關(guān)Java自定義自旋鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+vue+Axios實(shí)現(xiàn)Token令牌的詳細(xì)過(guò)程
Token是在服務(wù)端產(chǎn)生的,前端可以使用用戶名/密碼向服務(wù)端請(qǐng)求認(rèn)證(登錄),服務(wù)端認(rèn)證成功,服務(wù)端會(huì)返回?Token?給前端,Token可以使用自己的算法自定義,本文給大家介紹SpringBoot+vue+Axios實(shí)現(xiàn)Token令牌,感興趣的朋友一起看看吧2023-10-10Java常用類庫(kù)Apache Commons工具類說(shuō)明及使用實(shí)例詳解
這篇文章主要介紹了Java常用類庫(kù)Apache Commons工具類說(shuō)明及使用實(shí)例詳解,需要的朋友可以參考下2020-02-02使用 Spring Boot 2.0 + WebFlux 實(shí)現(xiàn) RESTful API功能
什么是 Spring WebFlux, 它是一種異步的, 非阻塞的, 支持背壓(Back pressure)機(jī)制的Web 開(kāi)發(fā)框架.下面通過(guò)本文給大家介紹使用 Spring Boot 2.0 + WebFlux 實(shí)現(xiàn) RESTful API功能,需要的朋友參考下吧2018-01-01SpringBoot Admin的簡(jiǎn)單使用的方法步驟
本文主要介紹了SpringBoot Admin的簡(jiǎn)單使用的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Java類中this關(guān)鍵字與static關(guān)鍵字的用法解析
這篇文章主要介紹了Java類中this關(guān)鍵字與static關(guān)鍵字的用法解析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09基于Java實(shí)現(xiàn)動(dòng)態(tài)切換ubuntu壁紙功能
這篇文章主要為大家詳細(xì)介紹了如何使用 Java 在 Ubuntu Linux 系統(tǒng)中實(shí)現(xiàn)自動(dòng)切換壁紙的示例程序,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11@RequestBody,@RequestParam和@Param的區(qū)別說(shuō)明
這篇文章主要介紹了@RequestBody,@RequestParam和@Param的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03