java中如何實現可重入的自旋鎖
說明
1、是指試圖獲得鎖的執行緒不會堵塞,而是透過迴圈獲得鎖。
2、優點:減少上下文切換的消耗。
缺點:迴圈消耗CPU。
例項
public class ReentrantSpinLock { private AtomicReference<Thread> owner = new AtomicReference<>(); // 可重入次數 private int count = 0; // 加鎖 public void lock() { Thread current = Thread.currentThread(); if (owner.get() == current) { count++; return; } while (!owner.compareAndSet(null, current)) { System.out.println("--我在自旋--"); } } //解鎖 public void unLock() { Thread current = Thread.currentThread(); //只有持有鎖的執行緒才能解鎖 if (owner.get() == current) { if (count > 0) { count--; } else { //此處無需CAS操作,因為沒有競爭,因為只有執行緒持有者才能解鎖 owner.set(null); } } } public static void main(String[] args) { ReentrantSpinLock spinLock = new ReentrantSpinLock(); Runnable runnable = () -> { System.out.println(Thread.currentThread().getName() + "開始嘗試獲取自旋鎖"); spinLock.lock(); try { System.out.println(Thread.currentThread().getName() + "獲取到了自旋鎖"); Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } finally { spinLock.unLock(); System.out.println(Thread.currentThread().getName() + "釋放了了自旋鎖"); } }; Thread thread1 = new Thread(runnable); Thread thread2 = new Thread(runnable); thread1.start(); thread2.start(); } }
以上就是java中實現可重入自旋鎖的方法,希望對大家有所幫助。更多Java學習指路:
本教程操作環境:windows7系統、java10版,DELL G3電腦。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/758/viewspace-2829950/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Golang可重入鎖的實現Golang
- Java 中15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖,樂觀鎖,分段鎖,自旋鎖等等Java
- Redis實現可重入的分散式鎖Redis分散式
- 可重入鎖與不可重入鎖理解
- 可重入鎖
- ReentrantLock可重入鎖、公平鎖非公平鎖區別與實現原理ReentrantLock
- 輕鬆搞懂Java中的自旋鎖Java
- 死鎖和可重入鎖
- Java併發-顯式鎖篇【可重入鎖+讀寫鎖】Java
- 淺談Java中的鎖:Synchronized、重入鎖、讀寫鎖Javasynchronized
- redis分散式鎖-可重入鎖Redis分散式
- java 中的鎖 -- 偏向鎖、輕量級鎖、自旋鎖、重量級鎖Java
- Java 種15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖等等...Java
- Java 種15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖等等Java
- 可重入鎖原始碼分析原始碼
- 自旋鎖、阻塞鎖、可重入鎖、悲觀鎖、樂觀鎖、讀寫鎖、偏向所、輕量級鎖、重量級鎖、鎖膨脹、物件鎖和類鎖物件
- 【Java】深入理解ReentrantLock可重入鎖之簡單使用JavaReentrantLock
- 【java併發程式設計】ReentrantLock 可重入讀寫鎖Java程式設計ReentrantLock
- java重入鎖、公平鎖和非公平鎖Java
- Java 重入鎖 ReentrantLock 原理分析JavaReentrantLock
- 【Java面試】什麼是可重入,什麼是可重入鎖? 它用來解決什麼問題?Java面試
- Redisson 分散式鎖原始碼 01:可重入鎖加鎖Redis分散式原始碼
- ReentrantLock可重入鎖——原始碼詳解ReentrantLock原始碼
- 記一次 "排它鎖" 和 "自旋鎖" 的簡單實現
- Java中鎖的實現方式Java
- ZooKeeper 分散式鎖 Curator 原始碼 01:可重入鎖分散式原始碼
- Java併發基礎-鎖的使用及原理(可重入鎖、讀寫鎖、內建鎖、訊號量等)Java
- Springboot基於Redisson實現Redis分散式可重入鎖【案例到原始碼分析】Spring BootRedis分散式原始碼
- [Java併發]AQS的可重入性JavaAQS
- 使用Rust為RISC-V OS 實現自旋鎖Rust
- Go 為什麼不支援可重入鎖?Go
- 重入鎖的理解
- java中的鎖及實現原理Java
- 自旋鎖spinlock
- ZooKeeper 分散式鎖 Curator 原始碼 03:可重入鎖併發加鎖分散式原始碼
- Linux核心自旋鎖Linux
- Java併發包原始碼學習系列:ReentrantLock可重入獨佔鎖詳解Java原始碼ReentrantLock
- ZooKeeper 分散式鎖 Curator 原始碼 02:可重入鎖重複加鎖和鎖釋放分散式原始碼