說明
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怎麼實現可重入的自旋鎖的詳細內容。更多資訊請關注PHP中文網其他相關文章!