Explanation
1. It means that the thread trying to obtain the lock will not be blocked, but will obtain the lock through a loop.
2. Advantages: Reduce the consumption of context switching.
Disadvantages: Loop consumes CPU.
Example
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(); } }
The above is the detailed content of How to implement a reentrant spin lock in java. For more information, please follow other related articles on the PHP Chinese website!